Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Wybieranie wierszy i grupowanie
Forum PHP.pl > Forum > Bazy danych > MySQL
likon1
Witam, posiadam 3 tabele dajmy na to:

event (id, name, .. ), event_users (id, user, event ), wait (id, time, event)

Wszystko dziala tak ze do wierszy w tabeli event podczepiam kolejnych uzytkownikow do wydarzen ( do wydarzen zas podpinam inner joinem tabele wait ).

Chcialbym jednak by wypisalo mi jedyne te wydarzenia w ktorych nie ma podpietego usera o np. moim id

Probowalem juz z tym group by i innymi ale ciagle zwraca mi bledne dane
Moglby ktos chociaz schematycznie to nakreslic?
Mchl
Kod
SELECT
  e.id, e.name
FROM
  event AS e
LEFT JOIN
  event_users AS eu
ON
  e.id = eu.event
WHERE
  eu.user = ?
  AND  eu.event IS NULL
likon1
NIestety ten przyklad zwraca mi neprawidlowe wyniki
Mchl
Podaj jakieś przykładowe dane, i jakie wyniki chciałbyś otrzymać.
likon1
Moze inaczej posadam tabele:

event_main
  1. id inne atrybuty ( name itp.) malo istotne
  2. 1 ...
  3. 2 ...
  4. 3 ...
  5. 4 ...


event_users
  1. id event user atrybuty malo wazne
  2. 1 2 3 ...
  3. 2 2 4 ...
  4. 3 3 4 ...
  5. 4 1 2 ...
  6. 5 1 3 ...
  7. 6 4 4 ...


event_wait
  1. id event time_start inne atrybuty
  2. 1 1 ...
  3. 1 3 ...
  4. 2 2 ...
  5. 2 4 ...


I teraz tak chce miec w wyniku wszystkie dane z tabeli event_main oraz dalaczone do niej dane z event_wait ( tu nie ma problemu bo zawsze jest w stosnku jeden - do jednego) tylko te eventy do ktorych userzy sie nie dolaczyli

Dal wyniku bez usera =2

Maja siie zwrocic wartosci dla eventow 3,2,4 poszerzone o tabele event_wait







Mchl
Kod
SELECT
  t1.id, t1.user, t1.event
FROM
  event_user AS t1
LEFT JOIN (
  SELECT
    DISTINCT user
  FROM
    event_user
  WHERE
    user != 2
) AS t2
ON
  t1.user = t2.user
WHERE
  t2.user IS NULL
likon1
Heh to zapytanie zwraca cos odwrotnego - wszystkie eventy w ktorych uczestniczyl dany user:)

Zapytane zwrocilo eventy innych uczestnikow innych niz 2, ale nie wyklucza to ze 2 tez czasem w nim nie uczestniczyla

Dokladnie takie wyrazenie zwrocilo to co chcialem:

Zrobilem to jednak na piechote bo licze jakby ilosc uztkownikow na event bez tych userow z id=2 i z tym id a potem porownuje = jesli tyle samo to go wypisuje

Zna ktos jakis lepszy pomysl bo to jest zbyt dlugie..


  1. SELECT event_main . * , event_wait . *
  2. FROM (
  3.  
  4. SELECT event, count( event ) AS cnt
  5. FROM event_users
  6. GROUP BY event
  7. ) AS tab2
  8. LEFT JOIN (
  9.  
  10. SELECT event, count( event ) AS cnt2
  11. FROM event_users
  12. WHERE user !=2
  13. GROUP BY event
  14. ) AS tab1 ON tab2.event = tab1.event
  15. LEFT JOIN event_main ON tab1.event = event_main.id
  16. LEFT JOIN event_wait ON tab1.event = event_wait.event
  17. WHERE cnt = cnt2
  18. AND time_start IS NOT NULL
  19. LIMIT 0 , 30
Mchl
Widzę, że coś przysypiałem wczoraj...
Kod
SELECT
  DISTINCT t.event
FROM
  event_user AS t
LEFT JOIN (
  SELECT
    t1.event
  FROM
    event_user AS t1
  LEFT JOIN (
    SELECT
      DISTINCT user
    FROM
      event_user
    WHERE
      user != 2
  ) AS t2
  ON
    t1.user = t2.user
  WHERE
    t2.user IS NULL
) AS sq
ON t.event = sq.event
WHERE sq.event IS NULL
likon1
Sprawdzilem szybkosc dzialania Twojego i mojego zapytania i jednak moje jest szybsze:)

Mimo wszystko dzieki za pomoc
Mchl
Może potrzeba mu lepszych indeksów? tongue.gif
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.