没有Group By的MySQL数据过滤器

时间:2016-06-09 12:32:10

标签: php mysql select group-by

我为我的化学实验创建了数据库,而不是使用Excel。我正在填写HTML表单和php函数,对这些数据进行一些计算,然后将它们插入到名为 exp 的MySQL数据库表中。我不想让你厌烦细节。 exp 的表格设计就是这样;

example table

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 ......

非常感谢任何帮助。可能是一个更好的数据库设计?

1 个答案:

答案 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