我们可以在 WHERE 子句中对同一列使用多个 AND 条件吗? [复制]

Posted

技术标签:

【中文标题】我们可以在 WHERE 子句中对同一列使用多个 AND 条件吗? [复制]【英文标题】:Can we use multiple AND conditions for the same column in WHERE clause? [duplicate] 【发布时间】:2018-05-18 21:09:36 【问题描述】:

我尝试在WHERE 子句中对同一列使用AND,但它没有给我任何输出。但是数据集中有两个满足给定条件的客户名称。我哪里出错了?

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.西雅图 WA 98105 555-2671 10001 10 2 10001 Doris Hartwig 4726 - 11th Ave. N.E.西雅图 WA 98105 555-2671 10001 22 1

【问题讨论】:

这应该可以。您定义了完全相同的条件mp.StyleID = 24 and mp.StyleID = 24。你能展示一些示例数据吗? 我投票结束,因为“愚蠢” “看起来 mysql 工作台只考虑第一个条件”:你为什么这么说?你的表中有什么数据,你期望什么输出,你得到了什么? CustomerID CustFirstName CustLastName CustStreetAddress CustCity CustState CustZipCode CustPhoneNumber CustomerID StyleID PreferenceSeq 10001 Doris Hartwig 4726 - 11th Ave. N.E.西雅图 WA 98105 555-2671 10001 10 2 10001 Doris Hartwig 4726 - 11th Ave. N.E.西雅图 WA 98105 555-2671 10001 22 1 @Sree 你能把这些数据放在问题中而不是评论中吗?你不能在评论中格式化它 【参考方案1】:

条件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.CustFirstNamec.CustLastName 添加到GROUP BY。或者,您只能按 ID 分组,然后在名字和姓氏上使用 MIN()MAX()。两种方式都差不多。

此查询仅在您的数据永远不会有一个客户具有相同 StyleID 的情况下才有效(例如:客户 1001 有 3 条记录具有 StyleID 15、24 和 24)。

【讨论】:

处理具有相同styleid的多行,HAVING COUNT(DISTINCT mp.styleid) = 2【参考方案2】:

WHERE 条件作用于由 FROM 子句创建的行,而不是跨行,如果您尝试 WHERE somefield = 1 AND somefield = 2,您将永远不会得到结果,一个字段不能同时有两个值。

我认为你正在寻找的是

SELECT ...
FROM ...
WHERE somefield IN (15, 24)
GROUP BY ...
HAVING COUNT(DISINCT somefield ) = 2
;

【讨论】:

【参考方案3】:

如果您的单一条件查询未返回任何行,则您的查询将不会返回任何行。

请试试这个:

SELECT CONCAT(c.CustFirstName," ",c.CustLastName) AS CustomerName
FROM Musical_Preferences mp
JOIN Customers c ON c.CustomerID = mp.CustomerID 
WHERE mp.StyleID = 24;

它会返回任何东西吗?

【讨论】:

不,它也给出了没有 WHERE 条件的结果。我试过了,它给了我所有的 CustomerNames,总共 36 行。 单身WHERE条件怎么样? 当我尝试仅使用 'where mp.StyleID = 24' 时,它给出了 2 个正确的结果,同样,当我尝试使用 'where mp.StyleID = 15' 时,它给出了 3 个结果,这又是正确的.对于 StyleID = 15 和 StyleID = 24,有两个客户,我应该得到这两个名字,但我没有得到任何结果。 我有点放弃了。这是一个非常简单的案例——如果为真的话——应该作为一个 MySQL 错误提交。你用的是什么 MySQL 版本? 对不起。我不清楚 - 我的意思是“我认为 OP 想要一件他没有明确要求的东西” - 他期待 WHERE-AND 返回“喜欢爵士和摇滚的人”,因为他的 WHERE-OR 做到了(发生to) 返回“喜欢爵士乐或摇滚乐的人”。也许他应该提出另一个问题,而不是解决这个问题......

以上是关于我们可以在 WHERE 子句中对同一列使用多个 AND 条件吗? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

用where子句在同一张表上计算多个条件

使用不同的where子句更新多个列

当 where 子句列中没有聚集索引时,并行更新导致死锁

我可以在 MERGE 语句中对目标应用 WHERE 子句吗?

Spark SQL - IN 子句

在MySQL数据库中使用多个WHERE子句值更新多个列值时出现错误。