首页 > 解决方案 > SQL 查询仅获取所有请求的 2 列匹配发生的结果

问题描述

我想得到一个结果,其中可以为第 2 列和第 3 列的三个(或更多)组合找到第 1 列的值(成对?)示例...这是一个包含 3 列的假设表:

水果 | 特质 | 描述
-------------------------------------------
苹果 | 颜色 | 红色的
苹果 | 形状 | 圆形的
梨 | 表面 | 光滑的
梨 | 茎| 红色的
葡萄| 高分辨率照片| CLIPARTO 形状 | 圆形的
葡萄| 高分辨率照片| CLIPARTO 颜色 | 红色的
葡萄| 高分辨率照片| CLIPARTO 表面 | 光滑的

我想找到形状=圆形、颜色=红色、表面=光滑的水果。上表中的结果应该是“葡萄”,但我试图找出正确的 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 */

标签: mysqlsql

解决方案


你离得太近了。只需继续从您的子句中选择水果,不要担心计数 - 您使用 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')

您可以在我使用的 SQL Fiddle上进行测试


推荐阅读