使用PDO和MYSQL来比较行并切换到列

问题描述 投票:0回答:1

我有一个产品表、一个印记表、一个制造商表和一个成分表 - 以及其他表。

我当前正在生成信息并使用所谓的“file_name”作为 ID(这是 FDA 分配的 36-40 位数字 ID,与每个产品一起使用)。现在发生的事情是人们输入几个字母,自动完成下拉列表提供了准确的拼写。当他们单击“提交”时,它会显示所有匹配的条目。如果他们选择通用产品,它还包括“品牌”产品 - 如果他们输入品牌,它也包括通用产品。

当前显示如下:

Sold by:        Sold using   Available    Chemical name                Data based
                  name        Since:                                   on company 
                                                                     report submitted: 
C----- Health    Lortab      2011-01-13  Hydrocodone Bitartrate etc  2010-12-07

R—Distributors   Hydrocodone 2010-02-18  Hydrocodone Bitartrate etc  2009-12-17
                 Bitartrate
                 And Acetaminophen

C-- Health       Vicodin     1983-01-07   Hydrocodone Bitartrate etc  2009-11-03

R—Distributors   Hydrocodone 2010-07-30   Hydrocodone Bitartrate etc  2010-12-28
                 Bitartrate
                 And Acetaminophen

这工作正常。我将在左侧添加一个复选框,最多可以选择 3 个产品进行比较和附加信息。

下一步:

他们检查了 1、2 或 3 个项目后,我想像这样显示:

“您检查的所有版本的产品都含有以下成分:” (所有所选产品共有的成分)。

乙酰氨基酚、纤维素、玉米、交聚维酮、氢可酮酒石酸氢盐、微晶、淀粉和硬脂酸

(显示每个产品中并非所有人共有的成分。 最终结果在列中)

“此外,您选择的每种产品都含有以下成分:”

COLUMN 1(Product 1)         COLUMN 2 (Product 2)         COLUMN 3 ( Product 3)
COPOVIDONE                  MAGNESIUM STEARATE         CROSCARMELLOSE SODIUM
CROSCARMELLOSE SODIUM       POVIDONE                   D&C YELLOW NO. 10
D&C RED NO. 27              SILICON DIOXIDE            FD&C BLUE NO. 1
D&C RED NO. 30                                         POVIDONE
HYDRATED SILICA                                        SILICON DIOXIDE
MAGNESIUM STEARATE                                     SUCROSE

显示结束

配料表:20000行,46列。每行都是不同的药物,包含 ID、文件名和成分。每种药物(行)都有不同的成分组合和数量。未使用的字段标记为“Null”;:

每行成分列:
ID、 文件名、 0_gred、 1_gred、 2_gred、 3_gred、 4_gred、 5_gred、 6_gred、 7_gred、 8_gred、 9_gred、 10_gred、 11_gred、 12_gred、 13_gred、 14_gred、 15_gred、 16_gred、 17_gred、 18_gred、19_gred、20_gred(等等) 43_gred)

问题是如何以及使用什么方法来获取我所需的成分格式。我有开发注册系统的经验,对 PHP 有相当的了解,并且开始习惯 PDO。我的 Sql 经验很少,基本上是在“需要知道”的基础上。

我想知道我是否应该专注于 MySQL 查询的怪物,或者更多地关注 php 方面。我考虑过一个查询,给出所有 3 种药物共有的成分,然后从每个单独的药物列表中减去该结果以获得第二部分,但这似乎是相当高级的 mysql - 特别是因为我需要数据从行布局切换到列布局。有什么帮助吗?

另一个想法是执行一个查询,连接每行的成分,然后在 php 端执行数组过程。问题是,我很难找到正确的代码来从每行中提取成分,因为与“已使用”字段相比,“NULL”字段的数量因每行而异。 (如何计算 PDO 查询中的空列?我已经尝试过获取表中列的完整计数。)

对我来说,这是一个需要几个步骤的脑筋急转弯。我正在寻找“神奇的”MySql 代码(如果存在)和/或关于您将采用哪种方法(使用 php、mysql、PDO)的建议。

感谢您的兴趣/帮助! 劳拉

php mysql pdo pivot row
1个回答
0
投票

我找到了一种 php 方法来完成我需要的事情。我确信有更快的 MySql 方式。如果您知道请分享!劳拉

首先,我将 Mysql 空值设置为默认为“no_ingre”。

然后我对这 3 个选择执行了 3 次以下代码: SELECT '所有成分字段 WHERE id=$name_of_id'

$result=$stmt->fetch(PDO::FETCH_ASSOC);
foreach($result as $key => $value) {
    if ($value == "no_ingre") unset($result[$key]);
}

找到所有人都常见的成分:

$same_detect= array_intersect($result, $result2, $result3);
$p_same=(implode(", ", $same_detect));

echo "<br />The below ingredients are in all of the chosen products<br />";
echo $p_same;

要找到所有人都不常见的:执行以下代码 3 次(针对每个成分数组):

foreach ($result as $item) {
if (!in_array($item, $same_detect, true)) {
echo ("<tr><td>" . $item . "</td></tr>"); }
© www.soinside.com 2019 - 2024. All rights reserved.