我想检查多个条件的列。 列是
user_id auction_id status
7 102 L
7 103 W
7 104 B
7 105 null
现在我想基于用户ID和状态选择auction_id,所以这是我写的初始代码
select auction_id
from user_auction_rel
where user_id =7
and status = 'B'
OR STATUS = NULL ;
结果是我得到了拍卖104,因为状态B是先给出的。 在网上退房后,我想出了这个代码
select auction_id
from user_auction_rel
where status in ('L' , 'W')
group by user_id = 7;
但这也返回了类似的结果..只返回状态为L的拍卖ID ..所以我需要一个sql查询,它将能够根据这两种状态返回拍卖ID ..提前感谢..
答案 0 :(得分:3)
第一次尝试有两个问题。首先,您无法将NULL
与等于运算符进行比较。您必须改为使用STATUS IS NULL
。
其次,运营商优先权导致此处出现问题。您需要将status = 'B' OR STATUS IS NULL
括在()
组中。否则,AND
的绑定比OR
更紧密,您将得到错误的结果。
SELECT
auction_id
FROM user_auction_rel
WHERE
user_id =7
AND (status = 'B' OR status IS NULL)
/* or using the IN(): */
/* AND (status = IN('L','W') OR status IS NULL) */
以下是演示:http://sqlfiddle.com/#!2/eb36e0/1
由于GROUP BY
,您的第二次尝试失败了。由于查询中没有聚合(MAX(),MIN(),COUNT(),SUM()
),因此没有理由使用GROUP BY
。表达式group by user_id = 7
实际上评估为GROUP BY 1
,并且所有结果都组合在一起。如果在大多数其他RDBMS中出现错误,MySQL会允许它并为auction_id
列提供不确定的结果集。
答案 1 :(得分:2)
括号是你的朋友。你的第一个疑问是:
select auction_id
from user_auction_rel
where user_id =7
and status = 'B'
OR STATUS = NULL
但添加括号会完全改变含义
select auction_id
from user_auction_rel
where user_id =7
and
(
status = 'B'
OR STATUS is NULL
)
答案 2 :(得分:0)
查询应为:
从user_auction_rel中选择auction_id,其中user_id = 7且status ='B'或STATUS IS NULL;
通过此,您将获得状态为空且状态= B
的两行答案 3 :(得分:0)
试
SELECT auction_id FROM user_auction_rel WHERE user_id =7 AND (status = 'B' OR status IS NULL);
由于AND优先,您需要将OR部分括在括号中。另外要检查空值,请使用IS NULL而不是= NULL