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

时间:2011-07-08 10:28:12

标签: mysql pdo row pivot

我有一个Products表,一个Imprint表,一个Manufacturer表和一个成分表 - 以及其他表。

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

当前显示如下:

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项后,我想显示如下:

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

乙酰氨基酚,纤维素,玉米,CROSPOVIDONE,氢甲酸二氢钙,微晶,淀粉和硬脂酸

(显示每种产品的成分并非所有人共同拥有。 最终结果在COLUMNS)

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

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

显示结束

成分表:有20,000行,46列。每一行都是不同的药物,包含id,文件名和成分,每种药物(行)都有不同的组合和成分数量。未使用的字段标记为“空”;:

每行中的成分列:
id,file_name,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 - 特别是因为我需要数据从行切换到COLUMN布局。有什么帮助吗?

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

对我来说,这是一个有几个步骤的braintwister。我正在寻找“神奇的”MySql代码(如果它存在)和/或建议您将采用什么方法(使用php,mysql,PDO)。

您的兴趣/帮助表示赞赏! 劳拉

1 个答案:

答案 0 :(得分: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>"); }