在MySQL中查找具有多个引用值的行

时间:2013-08-14 00:56:39

标签: mysql sql

我一直在努力解决这个问题。靠在墙上。我知道这很容易。

我想在参考表上选择符合多个条件的项目。这是一个可以帮助说明问题的示例模式

tblCars
------------
CarID
CarName

tblCarColors
------------
ColorID
Color

tblCarColorXRef
------------
ID
CarID
ColorID

基本上,我想找到我正在搜索的具有多种颜色的汽车。继续这个例子。让我们说在车牌桌上的丰田是多色的..黑色和黄色

丰田的CarID将是1

黑色的ColorID为1,黄色为2

我需要找到tblCarColorXRef表中与1 AND 2匹配的所有汽车。必须是'和'。我不想找到黑色的汽车或黄色的汽车,而是包含黄色和黑色的汽车。

问题是,我可以搜索WHERE ColorID = 1 AND ColorID = 2.这永远不会是真的,所以这就是头部撞击开始的地方。我需要用其他表中的其他条件包装此查询,我接近HAVING和COUNT但是,这不一定准确或正确。

旁注...汽车可以在XRef表中使用1种或多种颜色。

3 个答案:

答案 0 :(得分:0)

你可以试试这个。

select carid
  from tblCarColorXRef
 where colorid in (1,2)
 group by carid
having count(colorid = 2);

如果汽车颜色组合不是唯一的,您可以使用count(disinct colorid) = 2

答案 1 :(得分:0)

我对SQL有点生疏,所以我可能会忽略某些东西(例如语法错误或逻辑错误),但这可能会帮助您入门。这就是我要尝试的:

选择那些在CarID 1的同一个表中至少有一个实例的ColorID,以及ColorID 2在同一个表中的一个实例。

SELECT a.CarID
FROM tblCarColorXRef a
WHERE
(
    SELECT COUNT(1) AS carsWithColor1
    FROM tblCarColorXRef b
    WHERE b.CarID = a.CarID AND b.ColorID = 1
    LIMIT 1
) > 1
AND
(
    SELECT COUNT(1) AS carsWithColor2
    FROM tblCarColorXRef b
    WHERE b.CarID = a.CarID AND b.ColorID = 2
    LIMIT 1
) > 1

答案 2 :(得分:0)

我会建议其他一些事情。

  1. 从表名中删除“tbl”。
  2. 尝试摆脱ID列 - 在这个例子中它们不是必需的,因为汽车的类型是你正在寻找的实际钥匙(本田,丰田等......) - 与颜色相同。这也可以帮助你的外部参照 - 它将有一个复合键作为主键而不是ID列。看看这是否有帮助 - CarColorExample,如果没有,请给我更多信息,我会修改。