SQL查询仅获取所有请求的2列匹配发生的结果

时间:2018-06-01 04:28:09

标签: mysql sql

我想得到一个结果,其中可以找到第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 */

3 个答案:

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

Demo

使用Mysql你也可以使用sum(a=b)SUM(TRAIT = 'color' AND DESCRIBED = 'red' )作为简写,使用sum()中的表达式将得到一个布尔值0/1,true / false