To jest szybkie zapytanie sql dotyczące skryptu „zaproś znajomych do tej grupy”.

Mam 2 tabele: users i group_members. Próbuję wykonać zapytanie, które wybiera wszystkich moich znajomych — reprezentowanych przez pierwszy wybór — i odejmuje wszystkich moich znajomych od użytkowników, którzy są już reprezentowani i stanowią część grupy — reprezentowanych przez drugi wybór.

Ciągle otrzymuję błąd składni i nie jestem pewien, dlaczego. Kiedy uruchamiam każde zapytanie wybierające samo, wyświetla mi ono poprawnie wszystkie identyfikatory uid moich znajomych (przy użyciu pierwszego zapytania), a także wszystkie identyfikatory użytkowników członków grupy (przy użyciu drugiego zapytania).

(SELECT a.uid, a.name_f, a.name_l, a.profile_pic, a.location FROM users a, friends b WHERE a.uid = b.friend_two AND b.friend_one = $VAR 
MINUS 
SELECT a.uid, a.name_f, a.name_l, a.profile_pic, a.location FROM users a, group_members m WHERE m.teamid = 95 and a.uid = m.userid)
0
user1011713 2 marzec 2012, 06:55

2 odpowiedzi

Najlepsza odpowiedź

MySQL nie obsługuje MINUS. Zazwyczaj można go odtworzyć za pomocą podzapytania NOT IN. To może wykonać zadanie:

SELECT
  a.uid,
  a.name_f,
  a.name_l,
  a.profile_pic, 
  a.location 
FROM users a, friends b 
WHERE a.uid = b.friend_two AND b.friend_one = $VAR
  AND a.uid NOT IN (
    SELECT subuser.uid FROM users subuser, group_members m WHERE m.teamid = 95 AND subuser.uid = m.uid
  )
3
Michael Berkowski 2 marzec 2012, 06:57

W tym celu możesz użyć podzapytania:

SELECT a.uid, a.name_f, a.name_l, a.profile_pic, a.location
FROM users a, friends b 
WHERE a.uid = b.friend_two 
  AND b.friend_one = $VAR
  AND a.uid NOT IN ( 
                   SELECT a.uid FROM users a, group_members m  
                   WHERE m.teamid=95 AND a.uid=m.userid)

Zobacz, jak Twoje drugie zapytanie jest częścią AND a.uid NOT IN (second_query)?

W rzeczywistości myślę, że możesz to zrobić nawet bez podzapytania:

SELECT a.uid, a.name_f, a.name_l, a.profile_pic, a.location
FROM users a
JOIN friends b ON a.uid = b.friend_two
JOIN group_members m ON a.uid=m.userid
WHERE b.friend_one = $VAR
  AND m.teamid != 95

To po prostu łączy wszystkie stoły razem, wybiera te z odpowiednim b.friend_one i odfiltrowuje te, które już znajdują się w m.teamid.

2
mathematical.coffee 2 marzec 2012, 07:00