Drukowana wersja tematu

Kliknij tu, aby zobaczyć temat w orginalnym formacie

Forum PHP.pl _ Przedszkole _ [MySQL]Problem z zapytaniem

Napisany przez: krzesik 12.03.2017, 16:41:30

Witam, mam problem z zapytaniem

mam dwie tabele:
- komunikaty (tutaj mam wszystki komunikaty)
idkom, tresckom, datakom, potwierdzeniekom

oraz
- potwierdzenia( tutaj zapisuję kto potwierdzil przeczytanie)
idpotw, datapotw, imie_nazwisko, idkom

chciałbym wyświetlić wszystkie komunikaty wymagające potwierdzenia, których jeszcze zalogowany user nie przeczytał. Robię to tak ale coś mi nie idzie...

  1. SELECT * FROM komunikaty LEFT JOIN potwierdzenia ON komunikaty.idkom = potwierdzenia.idkom
  2.  
  3. WHERE komunikaty.potwierdzeniekom = '1' AND (potwierdzenia.imie_nazwisko IS NULL )

Napisany przez: woxala123 12.03.2017, 16:46:25

Ale z tego zapytania wynika że wyświetlasz userów które maja puste pole

Napisany przez: krzesik 12.03.2017, 16:50:33

więc jak być powinno? przecież gdybym wiedział to nie zakładałbym wątku.
Ale po koleji
najpierw szukam czy są komunikaty z potwierdzeniem
select * from komunikaty where potwierdzenie = '1'

teraz muszę połączyć/sprawdzić czy ja jako zalogowany user już go czytałem czy też nie

select * from potwierdzenia where imie_nazwisko like 'MojeNazwisko' and idkom .....questionmark.gifquestionmark.gif?

Napisany przez: woxala123 12.03.2017, 16:55:08

  1. SELECT * FROM komunikaty LEFT JOIN potwierdzenia ON komunikaty.idkom = potwierdzenia.idkom
  2. WHERE komunikaty.potwierdzeniekom IS NULL
  3.  

Spróbuj tak

Napisany przez: krzesik 12.03.2017, 17:13:36

gdzie w tym zapytaniu kontroluję czy ja go już czytałem czy też nie?

Napisany przez: borabora 12.03.2017, 18:45:16

dziwnie skonstruowana baza. Z Twoich tabel wynika, że to są jakieś ogólne komunikaty do wszystkich userów, a nie jakieś indywidualne. W takim razie po co kolumna "komunikaty.potwierdzenieko" wystarczy Ci aby ktokolwiek go potwierdził? Jeśli nie to kolumna jest do wywalenia. powinieneś mieć 3 tabele:
komunikaty: idkom, tresckom, datakom
users: id, imie, nazwisko
potwierdzenie: idkom, userID, datapotwierdzenia

Napisany przez: krzesik 12.03.2017, 19:06:13

OK na tym etapie mogę jeszcze wszystko przerobić.
Generalnie mam takie założenia:
- baza z komunikatami dla wszystkich, ale pewne z nich muszą posiadać potwierdzenie przeczytania - stąd tabela potwierdzeń, oczywiście baza z userami też jest i funkcjonuje
- admin daje jakiś komunikat i ustawia flagę na "ON" - że żąda przeczytania i lecimy dalej....
loguję się do systemu, pojawia mi się modal że mam nieprzeczytaną wiadomość, np zaznaczam chceckboxa, submit insert do bazy np

  1. INSERT INTO potwierdzenia SET
  2. imie_nazwisko = '$imie_nazwisko',
  3. Idkom = '$id_kom',
  4. DataPotwierdzenia = NOW()



moim problemem jest "wyłuskanie" nieprzeczytanych komunikatów przy zalogowaniu dla danego usera



Napisany przez: borabora 12.03.2017, 19:52:25

zamiast

  1. imie_nazwisko = '$imie_nazwisko',

do tabeli wrzucaj userID.
po zalogowaniu zapisujesz sobie w sesji ten userID i wtedy zapytanie mogłoby wyglądać np tak (5 to id usera z sesji):
  1. SELECT k.* FROM komunikaty k
  2. LEFT JOIN potwierdzenia p ON k.idkom=p.idkom AND p.userID=5
  3. WHERE p.idkom IS NULL

jeżeli komunikaty mają miec flagę on/off to dorzucasz dodatkowy warunek do whera

Napisany przez: krzesik 12.03.2017, 20:49:42

dziękuję, dokładnie o to mi chodziło

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)