Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: sprawdzanie czy para kluczy nieistnieje
Forum PHP.pl > Forum > Bazy danych > MySQL
G4rcU
Witam,

cały dzisiejszy dzień borykam się z pewnym problemem, którego pomimo zaciągnięcia do pomocy wujka Google nie jestem w stanie samodzielnie rozwiązać (głównie z powodu trudności w sformułowaniu właściwego opisu problemu).
Zawsze staram się najpierw samemu dojść do rozwiązania, zanim poproszę o pomoc stąd ta porywająca ilość w moim liczniku postów wink.gif.

Mój problem jest następujący:

tabela users zawiera informacje o uzytkownikach

tabela events zawiera informacje o szkoleniach

tabela registrations składa się z pary kluczy primary (user_id, event_id ) gdzie przechowywane sa informacje o wszystkich szkoleniach na ktore zapisal sie uzytkownik, plus dwa dodatkowe pole na ewentualne uwagi oraz timestamp

na stronie mam wydzielony fragment, gdzie jest (powinno być) proponowane pierwsze nadchodzące wydarzenie na które user nie jest zapisany

no i teraz pytanie - jakim zapytaniem to wyłuskać z bazy?


próbowałem tym

  1. SELECT * FROM events
  2. LEFT JOIN registrations
  3. ON
  4. events.event_id <> registrations.event_id
  5. AND registrations.user_id <> 5
  6.  
  7. WHERE events.event_date > NOW()
  8. ORDER BY events.event_date ASC LIMIT 1

ale nie działa to tak jak powinno ;/

nakieruje mnie ktoś na właściwy tor ?
luckyps
Moze cos takiego ?

  1. SELECT * FROM events LEFT JOIN registrations ON events.event_id = registrations.event_id
  2. WHERE events.event_date > NOW()
  3. AND /*id usera ktorego sprawdzasz*/ user_id <> registrations.event_id
  4. ORDER BY events.event_date
  5. LIMIT 1;


albo tak...

  1. SELECT * FROM events
  2. WHERE events.event_date > NOW()
  3. AND events.event_id NOT IN (SELECT registrations.event_id FROM registrations WHERE registrations.user_id <> /*id usera ktorego sprawdzasz*/ user_id)
  4. ORDER BY events.event_date
  5. LIMIT 1;
G4rcU
dziękuję za szybką odpowiedź

niestety żadne z tych zapytań nie zwraca oczekiwanych rezultatów ;/

pierwsze zapytanie (dokładnie tak samo jak i to moje), owszem, zwróci taki rekord z tabeli registrations, dla którego nie istnieje para kluczy user-event, z tym ze takim zwróconym rekordem będzie np user-event2 albo user2-event

drugie zapytanie natomiast wydaje się od razu wskazać właściwy "event" do zapisania się, jednakże po zapisaniu się na niego dalej widnieje on jako propozycja.
sannin
Nie wiem czy dobrze zrozumiałem problem, ale dla mnie to będzie:
  1. SELECT DISTINCT event_id FROM registrations WHERE user_id <> {id dla usera dla ktorego szukamy};
Można jeszcze ew. dodać JOIN i wyszukiwać jedynie nie rozpoczęte eventy.
G4rcU
sannin, niestety... ;/

DISTINCT zwróci mi każdy niepowtarzający się rekord z tabeli registrations

a, innymi słowy mówiąc, mi chodzi o wyświetlenie wszystkich events, których event_id nie znajduje się w tabeli registrations dla danego usera


//edit

a jednak!
udało się smile.gif

po chwili namysłu okazało się, ze sam sobie odpowiedziałem na swoje pytanie formułując problem innymi słowami

ponizej rozwiązanie:
  1. SELECT DISTINCT * FROM `events`
  2. WHERE event_id NOT IN
  3. ( SELECT event_id FROM `registrations` WHERE user_id = {id usera do znalezienia} )
  4. AND event_date > NOW()
  5. ORDER BY event_date ASC


luckyps oraz sannin dziękuję za naprowadzenie mnie na właściwy tor smile.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-2024 Invision Power Services, Inc.