2016-11-20 229 views
0
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的结果来执行这个查询

,如果我执行原来的查询,我发现这个

enter image description here

接受s HOULD是0,而不是1

+0

您从不限制原始查询将“接受”值设置为零,那么您为什么要这样做? –

+0

你是什么意思? – Sora

+0

请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查询 – Strawberry

回答

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
+0

@Thorsten是对的。我迟到了两分钟:-)。 –

+0

非常感谢你为我工作这个工作! – Sora

+0

不客气:-) –

1

有你的情况表达了一个错误

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) 
+0

我的目的是看看这位朋友是否存在user_requestes我想设置为可接受的0否则我需要接受的是1 – Sora

+0

是的,我明白这一点。这是u.id在(...)中做的情况。 'u.id在(...)'中的情况u.id,然而,你做了一些你不想要的东西。 –

+0

呃,......“这个朋友”?你在哪里子句得到*非朋友*。 –

0

这可能会更好地工作:

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