Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> sprawdzanie czy para kluczy nieistnieje
G4rcU
post
Post #1





Grupa: Zarejestrowani
Postów: 9
Pomógł: 2
Dołączył: 26.11.2008

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


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 ?

Ten post edytował G4rcU 9.02.2012, 17:16:14
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
luckyps
post
Post #2





Grupa: Zarejestrowani
Postów: 153
Pomógł: 41
Dołączył: 28.06.2011
Skąd: Częstochowa

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


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;


Ten post edytował luckyps 9.02.2012, 17:31:32
Go to the top of the page
+Quote Post
G4rcU
post
Post #3





Grupa: Zarejestrowani
Postów: 9
Pomógł: 2
Dołączył: 26.11.2008

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


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





Grupa: Zarejestrowani
Postów: 308
Pomógł: 13
Dołączył: 31.10.2008

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


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





Grupa: Zarejestrowani
Postów: 9
Pomógł: 2
Dołączył: 26.11.2008

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


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

Ten post edytował G4rcU 9.02.2012, 22:08:17
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 - 08:15