我为我的化学实验创建了数据库,而不是使用Excel。我正在填写HTML表单和php函数,对这些数据进行一些计算,然后将它们插入到名为 exp 的MySQL数据库表中。我不想让你厌烦细节。 exp 的表格设计就是这样;
Exp ID 是实验编号,产品是本实验中采集的样本。结果
我要做的是通过产品和结果过滤此数据。但是我不想显示整个过期(不仅仅是产品)如果它无法通过过滤器。
我正在通过HTML表单动态生成查询,我可以选择产品和结果编号及其值,并使用类似的查询。
Product C, Result5 > 1
SELECT * FROM exp WHERE ExpID IN
(SELECT ExpID FROM exp WHERE Product = 'C' AND Result5 > 1)
ORDER BY ExpID, Product ASC
此查询的功能类似于魅力。但是这个查询不允许我过滤两个具有相同经验的产品。如
Product C, Result5 > 1
Product F, Result5 > 0.2
虽然它们存储在不同的行中但我找不到合适的方法。我按顺序想要相同实验的所有数据,因此我无法使用group by
。最后,实验中可能有三种以上的产品,如C1,C2,C3 ......
非常感谢任何帮助。可能是一个更好的数据库设计?
答案 0 :(得分:0)
似乎第一步是确定哪些实验ID适用。
最初你用过这个:
SELECT ExpID
FROM exp
WHERE Product = 'C' AND Result5 > 1
现在你想要这些标准
Product C, Result5 > 1
Product F, Result5 > 0.2
获取实验ID:
SELECT ExpID
FROM exp
WHERE (Product = 'C' AND Result5 > 1)
OR (Product = 'F' AND Result5 > 0.2)
GROUP BY ExpID
HAVING COUNT(*) = 2
概念是,必须准确找到每个实验(即HAVING
子句)每个OR标准的次数。
最终您的查询是
SELECT *
FROM exp
WHERE ExpID IN
(SELECT ExpID
FROM exp
WHERE (Product = 'C' AND Result5 > 1)
OR (Product = 'F' AND Result5 > 0.2)
GROUP BY ExpID
HAVING COUNT(*) = 2)
ORDER BY ExpID, Product ASC
使用此
可能会获得更好的性能SELECT exp.*
FROM exp
JOIN
(SELECT ExpID
FROM exp
WHERE (Product = 'C' AND Result5 > 1)
OR (Product = 'F' AND Result5 > 0.2)
GROUP BY ExpID
HAVING COUNT(*) = 2) AS temp
ON exp.ExpID = temp.ExpID
ORDER BY exp.ExpID, exp.Product ASC