MySQL:选择包含所有列出的值的所有值

时间:2016-01-14 21:45:17

标签: mysql sql

我有这张桌子

+-------------+
|  id  | cars |
+------|------+
|  45  |   9  |
+------|------+
|  20  |   2  |
+------|------+
|  25  |   5  |
+------|------+
|  25  |   2  |
+------|------+
|  20  |   5  |
+------|------+
|  42  |   3  |
+------|------+
|  19  |   5  |
+------|------+

我需要得到像这样的表

+-------------+
|  id  | cars |
+------|------+
|  20  |   2  |
+------|------+
|  25  |   5  |
+------|------+
|  25  |   2  |
+------|------+
|  20  |   5  |
+------|------+

因此,我只需要在列表中选择那些具有所有相等汽车值的行(5,2)。 哦,我不能使用id列,只能使用汽车

我试过了这个查询

SELECT * FROM myTable where cars in(5, 2)

但它重新调整了这个表

+-------------+
|  id  | cars |
+------|------+
|  20  |   2  |
+------|------+
|  25  |   5  |
+------|------+
|  25  |   2  |
+------|------+
|  20  |   5  |
+------|------+
|  19  |   5  |
+------|------+

如何选择那些列表中包含所有valaues的行(5,2)? 对不起,如果我的问题不是很干净

2 个答案:

答案 0 :(得分:0)

inor - 类型匹配。将找到具有in列表中的一个值的任何记录。要将其更改为and类型,情况要复杂得多:

SELECT *
FROM yourtable AS main
LEFT JOIN (
   SELECT id, cars, COUNT(*) AS cnt
   FROM yourtable
   WHERE cars IN (5,2)
   GROUP BY cars
   HAVING cnt = 2
) AS child ON (main.id = child.id) AND (main.cars = child.cars)

子选择确定哪个cars同时包含52,然后父查询使用该查询来检索特定id的关联cars

告诫:没有经过测试,这是漫长的一天,大脑被炒了,但正确答案就在这附近。

答案 1 :(得分:0)

可能不是效率最高的,如果您的列表中有更多汽车,它会变得非常繁琐,但这会为您提供样品所需的结果:

select id, cars
from myTable
where id in (
  select id
  from myTable
  where cars = 5
)
and id in (
  select id
  from myTable
  where cars = 2
)

SQL Fiddle example