Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [SQL] INTERSECT
Forum PHP.pl > Forum > Przedszkole
patryczakowy
Mam sobie taka tabelę
|id|zaprasza|zaproszony|
pola zaprasza i zaproszony są parą id użytkowników w zależności kto kogo zaprosił tam znajduje się jego id jest to para tak zwanych przyjaciół żeby ich wydobyć używam takiego prostego zapytania:
  1. SELECT * FROM tabela WHERE zaprasza=$id OR zaproszony=$id

Ale teraz potrzebuje wspólnych przyjaciół dwóch użytkowników mowie sobie nic prostszego i sięgam do książki SQL-a aby znaleźć komendę mi potrzebną no i jest
  1. INTERSECT

przekrój dwóch tabel - ale niestety MySQL Jej nie obsługuje.
No i się zaciąłem.
Może ktoś podsunie pomysł z której strony to ugryźć.
Pilsener
Czyli rozumiem masz coś takiego:

zaprosił||zaproszony
1||2
1||3
1||4
9||3
9||4
9||7
x||n

I chcesz wszystkich zaproszonych zarówno przez usera 1, jak i 9, czyli zaproszonych o numerach 3 oraz 4?

  1. SELECT zaproszony, count(zaproszony) AS ile FROM friends WHERE zaprosil IN(1,9) GROUP BY zaproszony HAVING ile>1


W ile masz ile razy został zaproszony przez tych dwóch (lub więcej).
patryczakowy
Pozwól że zmodyfikuje troszkę twój przykład
1||2
3||1
1||4
9||3
9||4
9||7
x||n
Zamieniłem drugi wiersz w kolejności i teraz powiedzmy potrzebuje wspólnych znajomych usera 1 i 9 czyli wynik powinien być:
3 i 4, nigdy nie wiem czy user zaprosił czy został zaproszony równie dobrze ten sam wynik powinien być jak zmienimy kolejność jeszcze jednego wiersz czyli nie 9 zaprosił 4 tylko na odwrót:
1||2
3||1
1||4
9||3
4||9
9||7
x||n
Pilsener
Hmmm, niezależnie od kolumn? To będzie trudniejsze - łatwo to zrobić w PHP ale trzeba by zrzucić do tablicy całą tabelę, co nie jest za dobre... Moim zdaniem najłatwiej chyba wykonać to zapytanie dwa razy, raz za punkt wyjścia przyjmując zaproszonych, raz zapraszających, albo coś takiego:

  1. SELECT zaproszony FROM friends WHERE zapraszajacy IN(1,9) UNION ALL SELECT zapraszajacy FROM friends WHERE zaproszony IN(1,9) ORDER BY zaproszony
- unionem pojechać i zrzucić wszystkich, jeśli któryś się powtarza więcej niż raz, to jest to wspólny znajomy (w PHP teraz to obrobić).
patryczakowy
Wielkie dzięki szkoda że niemożna zrobić tego samym sql.
Jeszcze jedno mam pytanie czy w php jest jakaś gotowa funkcja która wypluje mi powtarzające się wiersze bo jak narazie znalazłem tylko usuwanie powtarzających wierszy?
Pilsener
http://pl2.php.net/manual/pl/book.array.php - nie widać. Moim zdaniem można napisać własną i użyć array_map, albo zrobić to jeszcze prościej - bezpośrednio w pętli odbierając dane z mysql:
  1. <?php
  2. while($dane = mysql_fetch_row($zapyt)){
  3. //warunek
  4. }
  5. ?>
- dane są już posortowane, więc wystarczy sprawdzić, czy nowy wiersz = stary i jeśli tak, to wrzucić ID do tablicy. Może da się to jakoś zrobić w mysql, ale pewnie za cenę znacznego skomplikowania zapytania lub użycia podzapytań.
patryczakowy
Wielkie dzięki za zainteresowanie tematem.
Cytat(Pilsener @ 28.05.2009, 08:24:01 ) *
  1. <?php
  2. while($dane = mysql_fetch_row($zapyt)){
  3. //warunek
  4. }
  5. ?>

Tak właśnie zrobiłem kolejny raz przekonałem się że najprostsze pomysły są najlepsze, a kombinowałem z funkcjami na tablicach aby wprowadzić sobie jakieś urozmaicenie, coś nowego się dowiedzieć (tak mam czasami jak mam troszkę wolnego czasu).
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.