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

Mysql SQL查询,仅在所有请求的2列匹配发生时获取结果,mysql,sql,Mysql,Sql,我想得到一个结果,其中第1列的值可以为第2列和第3列的三个(或更多)组合找到(成对?)例如。。。下面是一个假设的表,共有3列: FRUIT | TRAIT | DESCRIBED ------------------------------- Apple | color | red Apple | shape | round Pear | surface | smooth pear | stem | red grap

我想得到一个结果,其中第1列的值可以为第2列和第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
你太接近了。只要继续从子句中选择水果,就不用担心计数了——使用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')

你可以在

上进行测试,因为你离得太近了。只要继续从子句中选择水果,就不用担心计数了——使用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')

您可以在

上进行测试,这是另一种获取具有所有这些属性的水果的方法,您可以使用聚合

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'和descripted='red')
作为简写,使用
sum()中的表达式将生成布尔值0/1,true/false

另一种方法来获取具有所有这些属性的结果,您可以使用聚合

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'和descripted='red')
作为简写,使用
sum()中的表达式将生成布尔值0/1,真/假我只需执行以下操作:

SELECT fruit 
FROM table1 
WHERE (trait, described) IN ( ('shape', 'round'), ('color', 'red'), ('surface', 'smooth') )  
GROUP BY fruit 
HAVING count(fruit) = 3  ;
这比具有不必要子查询的查询更易于读取、写入和维护。至于性能,从性能的角度来看,
SELECT DISTINCT
groupby
基本相同,这不会进行不必要的子查询。因此,它也应该在这方面获胜。

我只想:

SELECT fruit 
FROM table1 
WHERE (trait, described) IN ( ('shape', 'round'), ('color', 'red'), ('surface', 'smooth') )  
GROUP BY fruit 
HAVING count(fruit) = 3  ;

这比具有不必要子查询的查询更易于读取、写入和维护。至于性能,从性能的角度来看,
SELECT DISTINCT
groupby
基本相同,这不会进行不必要的子查询。因此,它也应该在这方面取得胜利。

Dbitch的解决方案对我来说很有效,但是上面的方法是否有一些好处可以让它成为一种更好的方法?@user3385160您可以看到,它使用单个查询而不涉及子查询来完成所有逻辑,此外,我不确定您可以为查询和DecisedBMitch的解决方案运行explain plan的性能是否对我有效,但上述方法是否有一些好处,使其成为更好的方法?@user3385160您可以看到,它使用不涉及子查询的单个查询执行所有逻辑,另外,我不确定您可以为查询和决策运行explain plan的性能,这对我来说很有希望…但在我的实际表测试中,它给出的结果为零。。。从字段工厂描述符中选择实体id,其中((87708060)、(87588109)、(87738236))组中的(字段工厂描述符部分描述,字段工厂描述符描述项)按实体id具有计数(实体id)=3个字符,该字符。。。只是打字错误。非常感谢。我可能会选择这个。我很喜欢没有子查询顺便问一下,有没有办法让计数自动匹配in部分中的集合数?我以前见过类似的东西,但不是为了这个。正在四处寻找那个syntax@turpentyne . . . 一种方法是用
连接实现这样的逻辑。这对我来说很有希望…但在我的实际表测试中,它给出的结果是零。。。从字段工厂描述符中选择实体id,其中((87708060)、(87588109)、(87738236))组中的(字段工厂描述符部分描述,字段工厂描述符描述项)按实体id具有计数(实体id)=3个字符,该字符。。。只是打字错误。非常感谢。我可能会选择这个。我很喜欢没有子查询顺便问一下,有没有办法让计数自动匹配in部分中的集合数?我以前见过类似的东西,但不是为了这个。正在四处寻找那个syntax@turpentyne . . . 一种方法是使用
连接实现这种逻辑。