Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Zapytanie do bazy danych
Forum PHP.pl > Forum > Bazy danych > MySQL
CzarnyGsm
Witam serdecznie,

Zaprojektowałem bazę danych, która przetrzymuje dane z relacjami między użytkownikami.
Tabela: Friendship
Kolmuny: inviting_user_id , invited_user_id, status , sending_time, acceptance_time
Stowarzyłem zapytanie zwracające rekordy przyjaciół dla użytkownika XYZ, których sam osobiście zaprosił do grona przyjaciół i oni zaakcpetowali jego zaproszenie. Tylko bo kilku dnia olśniło mnie, że przecież przyjaciółmi użytkownika XYZ mogą być też osoby, które same zaprosiły XYZ.
Pytanie jest następujące w jaki sposób mogę dodać do mojego bieżącego zapytania(nie tworząc nowego), aby pobrało mi również przyjaciół, gdzie ja jestem invited_user_id ?
Moje aktualne zapytanie:
  1. SELECT
  2. `friendship`.*,
  3. `users`.`login`,
  4. `users`.`name`,
  5. `users`.`surname`,
  6. FROM `friendship`
  7. LEFT JOIN `users` ON friendship.invited_user_id = users.id
  8. WHERE (inviting_user_id = '3') AND (STATUS = 1)
  9. ORDER BY `users`.`surname` ASC


Z góry dziękuję za pomoc.

Pozdrawiam
sobol6803
  1. SELECT
  2. `friendship`.*,
  3. `users`.`login`,
  4. `users`.`name`,
  5. `users`.`surname`,
  6. FROM `friendship`
  7. LEFT JOIN `users` ON friendship.invited_user_id = users.id
  8. WHERE inviting_user_id = '3' AND invited_user_id='3' AND (STATUS = 1)
  9. ORDER BY `users`.`surname` ASC


O to chodzi?
CzarnyGsm
Dzięki bardzo za odpowiedź i zainteresowanie tematem. Przy tym zapytaniu wiązanie jest identyczne jak u mnie friendship.invited_user_id = users.id,
także zwróci to samo. A do tego w where dałeś inviting_user_id = '3' AND invited_user_id='3' więc nic tam to zapytanie nie zwróci, gdyż nie ma takiej możliwości aby w bazie był rekord że osoba zapraszająca zaprasza samą siebie.
Masz może inny pomysł? Wydaje mi sie, że zapytanie z UNION (łączeniem tabel) rozwiązałoby ten problem.

  1. SELECT
  2. `friendship`.*,
  3. `users`.`login`,
  4. `users`.`name`,
  5. `users`.`surname`,
  6. FROM `friendship`
  7. LEFT JOIN `users` ON friendship.invited_user_id = users.id
  8. WHERE (inviting_user_id = '3') AND (STATUS = 1)
  9. ORDER BY `users`.`surname` ASC
  10. UNION
  11. SELECT
  12. `friendship`.*,
  13. `users`.`login`,
  14. `users`.`name`,
  15. `users`.`surname`,
  16. FROM `friendship`
  17. LEFT JOIN `users` ON friendship.inviting_user_id = users.id
  18. WHERE (invited_user_id = '3') AND (STATUS = 1)
  19. ORDER BY `users`.`surname` ASC

Ale czy nie da się tego zrobić w jednym zapytaniu bez union? Macie jakie pomysły? Z góry dziękuję za pomoc.
mmmmmmm
  1. SELECT
  2. `friendship`.*,
  3. `users`.`login`,
  4. `users`.`name`,
  5. `users`.`surname`,
  6. FROM `friendship`
  7. LEFT JOIN `users` ON users.id IN (friendship.invited_user_id, friendship.inviting_user_id)
  8. WHERE (users.id = '3') AND (STATUS = 1)
  9. ORDER BY `users`.`surname` ASC
CzarnyGsm
Dzięki za pomoc. W ostateczności zapytanie wyszło takie (dzięki mmmmmmm za formułke z IN)
  1. SELECT
  2. `friendship`.*,
  3. `users`.`login`,
  4. `users`.`name`,
  5. `users`.`surname`,
  6. FROM `friendship`
  7. LEFT JOIN `users` ON users.id IN (friendship.invited_user_id, friendship.inviting_user_id)
  8. WHERE ( friendship.inviting_user_id = '$userID'
  9. OR
  10. friendship.invited_user_id = '$userID' )
  11. AND (STATUS =1)
  12. AND (users.id != '$userID')
  13. ORDER BY `users`.`login` ASC

i zapytanie elegancko zwraca dla zadanego $userId jego przyjaciół (tych, których zaprosił i potwierdzili znajomość jak również i tych, którzy go zaprosili i on potwierdził)
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.