2016-11-20 4 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 

Ich versuche, diese Abfrage auszuführen phpMyAdminAbfrage nicht Rückkehr zu den erwarteten Ergebnissen

select RequestedUserID from user_requestes where userID=3 

die obige Abfrage Rückkehr 79 als Ergebnis

mit und wenn ich ausführen die ursprüngliche Abfrage ich diese

gefunden

enter image description here

Akzeptiert s hould sein 0 und nicht 1

+0

Sie beschränken die ursprüngliche Abfrage niemals auf akzeptierte Werte von Null, also warum sollten Sie das erwarten? –

+0

was meinst du? – Sora

+0

Siehe http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-very-simple-sql- Frage – Strawberry

Antwort

1

Und was ist, wenn Sie Ihre Abfrage so schreiben?

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 
  • vor CASE nicht SELECT Verwenden;
  • Wenn Sie CASE gehen, wenn ... Syntax, müssen Sie Werte liefern und nicht die Bedingungen suchen (See MySQL documentation here)
+0

@Thorsten hat Recht. Ich kam zwei Minuten zu spät :-). –

+0

Vielen Dank diese Arbeit für mich! – Sora

+0

Gern geschehen :-) –

1

Es ist ein Fehler in Ihrem Fall Ausdruck

CASE u.ID WHEN u.ID in (...) 

lautet wie folgt: nachschlagen u.id in der Unterabfrage. Gefunden = wahr, nicht gefunden = falsch. In MySQL true = 1 und false = 0.

CASE u.ID WHEN <either 1 or 0> 

Sie fälschlicherweise werden die Benutzer-ID mit dem Booleschen Ergebnis zu vergleichen 1 oder 0

Sie wollen, dass diese statt:

SELECT 
    u.* , 
    CASE 
    WHEN u.ID in (select RequestedUserID from user_requestes where userID=3) THEN 0 
    ELSE 1 
    END AS Accepted 
FROM ... 

Durch die Übrigens: Es gibt wahrscheinlich einen semantischen Fehler in der Unterabfrage deiner Freunde, da es immer FriendID ist, die du zurücksendest. Ich nehme an, dass sein sollte:

and u.id not in 
(
    select case when FriendID = 3 then UserID else FriendID end 
    from friends 
    where UserID = 3 or FriendID = 3 
) 

oder einfach

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

mein Ziel ist es, zu sehen, ob dieser Freund in user_requestes existiert, ich möchte akzeptabel als 0 setzen, sonst brauche ich akzeptabel zu sein 1 – Sora

+0

Ja, ich verstehe das. Dies ist der Fall, wenn u.id in (...) 'tut. 'case u.id wenn du in (...)' bist, macht jedoch etwas anderes, was du nicht vorhast. –

+0

Äh, ... "dieser Freund"? Yor where-Klausel erhält * Nicht-Freunde *. –

0

Dies könnte besser funktionieren:

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) 

Beachten Sie die Verwendung von EXISTS als effizienter als IN (SELECT ...). Dito für LEFT JOIN ... IS NULL.

Verwandte Themen