我尝试将AND
用于WHERE
子句中的同一列,但它没有给我任何输出。但是数据集中有两个客户名称满足给定条件。我哪里出错?
SELECT CONCAT(c.CustFirstName," ",c.CustLastName) AS CustomerName
FROM Musical_Preferences mp
JOIN Customers c ON c.CustomerID = mp.CustomerID
WHERE mp.StyleID = 15 AND mp.StyleID = 24;
当我在OR
子句中为同一列添加WHERE
时,上述查询工作正常,但为什么不AND
?
我的数据:
CustomerID CustFirstName CustLastName CustStreetAddress CustCity CustState CustZipCode CustPhoneNumber CustomerID StyleID PreferenceSeq 10001 Doris Hartwig 4726 - 11th Ave. N.E. Seattle WA 98105 555-2671 10001 10 2 10001 Doris Hartwig 4726 - 11th Ave. N.E. Seattle WA 98105 555-2671 10001 22 1
答案 0 :(得分:3)
条件StyleID = 15 AND StyleID = 24
永远不能返回任何东西,因为它永远不会是真的。所以你得到的是预期的。如果您希望获得同时拥有StyleID
15和24(在不同记录中)的客户,则需要按客户对记录进行分组:
SELECT CONCAT(c.CustFirstName," ",c.CustLastName) AS CustomerName
FROM Musical_Preferences mp
JOIN Customers c ON c.CustomerID = mp.CustomerID
WHERE mp.StyleID IN(15, 24)
GROUP BY c.CustomerID, c.CustFirstName, c.CustLastName
HAVING COUNT(mp.CustomerID) = 2;
我已将c.CustFirstName
和c.CustLastName
添加到GROUP BY
。或者,您只能按ID分组,然后在名字和姓氏上使用MIN()
或MAX()
。两种方式都或多或少相同。
此查询仅在您的数据永远不会让客户具有相同StyleID
次数的情况下才有效(例如:客户1001有3条记录StyleID
15,24和24)。< / p>
答案 1 :(得分:1)
WHERE条件对FROM子句创建的行有效,而不是跨行,如果你尝试WHERE somefield = 1 AND somefield = 2
,你永远不会得到结果,一个字段不能同时有两个值。
我认为你在寻找的是
SELECT ...
FROM ...
WHERE somefield IN (15, 24)
GROUP BY ...
HAVING COUNT(DISINCT somefield ) = 2
;
答案 2 :(得分:0)
如果您使用单个条件的查询未返回任何行,则查询将不会返回任何行。
请试试这个:
SELECT CONCAT(c.CustFirstName," ",c.CustLastName) AS CustomerName
FROM Musical_Preferences mp
JOIN Customers c ON c.CustomerID = mp.CustomerID
WHERE mp.StyleID = 24;
它会返回什么吗?