【问题标题】:USING PDO & MYSQL to get rows compared and switched to columns使用 PDO 和 MYSQL 比较行并切换到列
【发布时间】:2011-07-08 10:28:11
【问题描述】:

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

我目前正在生成信息并使用所谓的“文件名”作为 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 个项目后,我想显示如下:

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

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

(显示并非所有人都持有的每种产品中的成分。 最终结果为 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、文件名和成分,每种药物(行)都有不同的成分组合和数量。未使用的字段被标记为“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等18_gred,18_gred 43_gred)

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

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

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

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

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

【问题讨论】:

  • 你当然需要先规范化表格。首先,请参阅:databases.about.com/od/specificproducts/a/firstnormalform.htm
  • 或者 TsackOverflow 上的这个例子(读取 43 而不是动态):stackoverflow.com/questions/439656/…
  • 是的,ypercube,我想知道这一点。此表是由 file_name 连接的较大表组的一部分。我设置了自动从下载的 xml 文档 (FDA) 中提取此数据的编码。 (换句话说,有一个单独的 PRODUCT 表,它通过 file_name 链接到 INGREDIENTS。(20,000 条记录)。如何以自动方式标准化,因为每次更新都会改变成分?
  • 我认为 ypercube 的意思是您需要一张表用于产品,另一张表用于成分FoundInProducts,另一张表用于成分描述。在产品中,您将只有与所有产品相关的通用信息,例如价格、库存数量、剂量等,以及唯一的 product_id。在 ingredientsFoundInProducts 中,每一行都有一个产品 ID 和一个由成分 ID 调用的成分。最后, ingredientsDescription 将包含所有成分共有的成分信息,例如 id、成分名称、分子量等。
  • 谢谢 Mike - 请原谅我不够清楚。这是我的第一个“帖子”(请原谅双关语)!我已经编辑了帖子以显示是什么。不幸的是,我没有资格发布可以更容易解释的屏幕截图。劳拉

标签: mysql pdo row pivot


【解决方案1】:

我想出了一种 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>"); }

【讨论】:

    猜你喜欢
    • 2016-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多