我想得到一个结果,其中可以找到第2列和第2列的三个(或更多)组合的第1列值。 3(成对?)示例...这里是一个3列的假设表:
FRUIT | TRAIT | DESCRIBED ------------------------------- Apple | color | red Apple | shape | round Pear | surface | smooth pear | stem | red grape | shape | round grape | color | red grape | surface | smooth
我想找到形状=圆形,颜色=红色,表面颜色=光滑的水果。上表中的结果应该是" grape",但是我试图找出正确的sql查询,我无法缩小范围。我得到苹果,因为它是红色的,因为它很顺利。但我不想要那些。我想要一种能够显示所有三种特征/描述值的水果。
我已经走到这一步,认为有一种方法可以使用组,我使用子查询 - 认为这会给我一种方法来要求。但它仍然没有给我“葡萄”。在结果中。
SELECT fruit /* DISTINCT ?*/ FROM table1 WHERE fruit
IN (SELECT fruit FROM table1 WHERE trait = 'shape' AND described = 'round')
AND (SELECT fruit FROM table1 WHERE trait = 'color' AND described = 'red')
AND (SELECT fruit FROM table1 WHERE trait = 'surface' AND described = 'smooth')
HAVING count(fruit) = 3 /* or whatever number of trait/described combos were searched for */
答案 0 :(得分:1)
你太近了。只要继续从你的条款中选择水果,不要担心计数 - 你也可以使用DISTINCT
SELECT DISTINCT FRUIT FROM Table1
WHERE FRUIT IN (SELECT FRUIT FROM Table1 WHERE TRAIT = 'shape' AND DESCRIBED = 'round')
AND FRUIT IN (SELECT FRUIT FROM Table1 WHERE TRAIT = 'color' AND DESCRIBED = 'red')
AND FRUIT IN (SELECT FRUIT FROM Table1 WHERE TRAIT = 'surface' AND DESCRIBED = 'smooth')
您可以在import
上进行测试答案 1 :(得分:1)
我会这样做:
SELECT fruit
FROM table1
WHERE (trait, described) IN ( ('shape', 'round'), ('color', 'red'), ('surface', 'smooth') )
GROUP BY fruit
HAVING count(fruit) = 3 ;
与具有不必要的子查询的查询相比,这更易于读取,写入和维护。至于性能,SELECT DISTINCT
从性能角度来看基本上与GROUP BY
相同,这不会做不必要的子查询。所以它也应该在这方面取得胜利。
答案 2 :(得分:0)
获得具有所有这些属性的水果的另一种方法是使用聚合
SELECT FRUIT
FROM table1
GROUP BY FRUIT
HAVING SUM(CASE WHEN TRAIT = 'color' AND DESCRIBED = 'red' THEN 1 ELSE 0 END ) > 0
AND SUM(CASE WHEN TRAIT = 'shape' AND DESCRIBED = 'round' THEN 1 ELSE 0 END ) > 0
AND SUM(CASE WHEN TRAIT = 'surface' AND DESCRIBED = 'smooth' THEN 1 ELSE 0 END ) > 0
使用Mysql你也可以使用sum(a=b)
,SUM(TRAIT = 'color' AND DESCRIBED = 'red' )
作为简写,使用sum()
中的表达式将得到一个布尔值0/1,true / false