Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL] select z wyborem pobieranego pola (IF ?)
-herbaciarz-
post
Post #1





Goście







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?
Go to the top of the page
+Quote Post
jasin
post
Post #2





Grupa: Zarejestrowani
Postów: 142
Pomógł: 32
Dołączył: 21.08.2008
Skąd: Toruń

Ostrzeżenie: (0%)
-----


A coś takiego?
  1. SELECT friendsid, friend1id FROM friends WHERE friend1id != 1
  2. UNION
  3. SELECT friendsid, friend2id FROM friends WHERE friend2id != 1


--------------------
Go to the top of the page
+Quote Post
mortus
post
Post #3





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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.

Ten post edytował mortus 28.03.2012, 21:20:46
Go to the top of the page
+Quote Post
herbaciarz
post
Post #4





Grupa: Zarejestrowani
Postów: 2
Pomógł: 0
Dołączył: 28.03.2012

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
mortus
post
Post #5





Grupa: Zarejestrowani
Postów: 2 178
Pomógł: 596
Dołączył: 25.09.2009
Skąd: Piwniczna-Zdrój

Ostrzeżenie: (0%)
-----


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).

Ten post edytował mortus 28.03.2012, 22:25:50
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 19:12