Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL] select z wyborem pobieranego pola (IF ?)
Forum PHP.pl > Forum > Przedszkole
herbaciarz
Witam,

Mam taki problem.

Mam moduł znajomych, tabelę friends, w niej pola: friendsid, date, friend1id, friend2id

Pole friend1id to ID osoby zapraszającej.
Pole friend2id to ID osoby zapraszanej.

Załóżmy, że mamy użytkownika o ID=1.
Interesuje nas wyświetlenie wszystkich znajomych użytkownika, czyli wszystkie rekordy gdzie w jednym z dwóch pól friend1id lub friend2id znajdzie się nasze ID=1.
  1. SELECT friendsid,friend1id,friend2id FROM friends WHERE friend1id =1 OR friend2id =1 GROUP BY date
  2. friendsid friend1id friend2id
  3. 66 1 2
  4. 62 1 15
  5. 68 1 16
  6. 63 1 24
  7. 70 1 26
  8. 69 1 27
  9. 60 11 1


Pytanie brzmi: Jak napisać zapytanie, żeby w wynikach w jednej kolumnie zawsze było ID "przeciwne". Czyli tutaj nie 1.
Czyli interesuje mnie wynik w zbliżonej postaci jak:
  1. friendsid friendid
  2. 66 2
  3. 62 15
  4. 68 16
  5. 63 24
  6. 70 26
  7. 69 27
  8. 60 11

Oczywiście nie interesują mnie jakieś obejścia w postaci warunków w PHP, ponieważ chciałbym później ciut rozbudować zapytanie do własnych potrzeb, ale jak pokonam tę barierę to dalej powinienem sobie poradzić.

Czy można się posłużyć jakimś IF, może jakieś inne sugestie?
jasin
A coś takiego?
  1. SELECT friendsid, friend1id FROM friends WHERE friend1id != 1
  2. UNION
  3. SELECT friendsid, friend2id FROM friends WHERE friend2id != 1
mortus
Można posłużyć się MySQL-owym IF-em:
  1. SELECT `friendsid`, IF(`friend1id` = 1, `friend2id`, `friend1id`) AS `friend` FROM `friends` WHERE `friend1id` = 1 OR `friend2id` = 1

lub CASE-em:
  1. SELECT `friendsid`, CASE `friend1id` WHEN 1 THEN `friend2id` ELSE `friend1id` END AS `friend` FROM `friends` WHERE `friend1id` = 1 OR `friend2id` = 1

lub UNION:
  1. SELECT `friendsid`, `friend2id` AS `friend` FROM `friends` WHERE `friend1id` = 1
  2. UNION ALL
  3. SELECT `friendsid`, `friend1id` AS `friend` FROM `friends` WHERE `friend2id` = 1

Przy czym wydajność musisz sprawdzić na większej liczbie rekordów i nie gwarantuję, że będzie ona wysoka.

@jasin: Kolego Twoje zapytanie nie wybiera znajomych użytkownika o identyfikatorze 1, ale wszystkie inne osoby.
herbaciarz
Dzięki mortus, Tobie jasin również dziękuję smile.gif Użyję opcji nr 1 z sugestii mortusa. Myślę, że na razie to dobre rozwiązanie, jeśli chodzi o wydajność to zawszę mogę ograniczyć pobieranie znajomych np. do 50 jednocześnie. Jeszcze raz dzięki smile.gif

PS. W końcu się zarejestrowałem headsetsmiley.png
mortus
Cytat(herbaciarz @ 28.03.2012, 23:14:28 ) *
...jeśli chodzi o wydajność to zawszę mogę ograniczyć pobieranie znajomych np. do 50 jednocześnie.

Niestety nie wpłynie to na wzrost wydajności, ponieważ ograniczenie zbioru wyników zapytania od określonego miejsca i do określonej liczby odbywa się zawsze na końcu (jest ostatnią "czynnością" podczas wykonywania zapytania).
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.