Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [SQL] INTERSECT
patryczakowy
post
Post #1





Grupa: Zarejestrowani
Postów: 420
Pomógł: 44
Dołączył: 22.10.2008

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


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źć.


--------------------
Sztuką jest widzieć to czego nie widać.
Go to the top of the page
+Quote Post
Pilsener
post
Post #2





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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).
Go to the top of the page
+Quote Post
patryczakowy
post
Post #3





Grupa: Zarejestrowani
Postów: 420
Pomógł: 44
Dołączył: 22.10.2008

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


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

Ten post edytował patryczakowy 27.05.2009, 15:13:37


--------------------
Sztuką jest widzieć to czego nie widać.
Go to the top of the page
+Quote Post
Pilsener
post
Post #4





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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





Grupa: Zarejestrowani
Postów: 420
Pomógł: 44
Dołączył: 22.10.2008

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


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?


--------------------
Sztuką jest widzieć to czego nie widać.
Go to the top of the page
+Quote Post
Pilsener
post
Post #6





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

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


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ń.
Go to the top of the page
+Quote Post
patryczakowy
post
Post #7





Grupa: Zarejestrowani
Postów: 420
Pomógł: 44
Dołączył: 22.10.2008

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


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


--------------------
Sztuką jest widzieć to czego nie widać.
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: 20.08.2025 - 10:08