查询不返回预期的结果
SELECT u.* ,
(select CASE u.ID
WHEN u.ID in (select RequestedUserID from user_requestes where userID=3) THEN 0
ELSE 1
END) AS Accepted
FROM users u
WHERE u.ID <>3
and u.id not in (select friends.FriendID
from friends
where friends.UserID=3 or friends.FriendID=3)
order by u.Name asc
我试图使用phpMyAdmin查询不返回预期的结果
select RequestedUserID from user_requestes where userID=3
上面的查询返回79
的结果来执行这个查询
,如果我执行原来的查询,我发现这个
接受s HOULD是0,而不是1
而如果你写你这样的查询?
SELECT
u.*,
CASE
WHEN u.ID IN (select RequestedUserID from user_requestes where userID=3) THEN 0
ELSE 1
END AS Accepted
FROM
users u
WHERE
u.ID <>3
and u.id not in (
select
friends.FriendID
from
friends
where
friends.UserID=3 or friends.FriendID=3
)
order by
u.Name asc
- CASE之前,不要使用SELECT;
- 如果你去CASE WHEN ...语法,你必须提供价值,而不是搜索条件(See MySQL documentation here)
有你的情况表达了一个错误
CASE u.ID WHEN u.ID in (...)
内容如下:查找u.id子查询。找到=真,未找到=假。在MySQL真= 1,假= 0
CASE u.ID WHEN <either 1 or 0>
您错误地将用户ID与布尔结果比较1或0
希望此相反:
SELECT
u.* ,
CASE
WHEN u.ID in (select RequestedUserID from user_requestes where userID=3) THEN 0
ELSE 1
END AS Accepted
FROM ...
由方式:您的朋友子查询中可能存在语义错误,因为它始终是您要返回的FriendID。我想,应该是:
and u.id not in
(
select case when FriendID = 3 then UserID else FriendID end
from friends
where UserID = 3 or FriendID = 3
)
或者干脆
and u.id not in (select FriendID from friends where UserID = 3)
and u.id not in (select UserID from friends where FriendID = 3)
我的目的是看看这位朋友是否存在user_requestes我想设置为可接受的0否则我需要接受的是1 – Sora
是的,我明白这一点。这是u.id在(...)中做的情况。 'u.id在(...)'中的情况u.id,然而,你做了一些你不想要的东西。 –
呃,......“这个朋友”?你在哪里子句得到*非朋友*。 –
这可能会更好地工作:
SELECT u.*,
IF(EXISTS (
SELECT *
from user_requestes
where userID = 3
AND RequestedUserID = u.ID),
0, 1) AS Accepted
FROM users AS u
LEFT JOIN friends AS f ON f.FriendID = u.ID
WHERE u.ID != 3
AND f.FriendID IS NULL
AND (f.UserID = 3 or f.FriendID = 3)
注意使用EXISTS
为比IN (SELECT ...)
更有效率。同上LEFT JOIN ... IS NULL
。
您从不限制原始查询将“接受”值设置为零,那么您为什么要这样做? –
你是什么意思? – Sora
请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查询 – Strawberry