Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [MySQL][PHP] Pobranie nieprzeczytanych wiadomości użytkownika
gogomania
post
Post #1





Grupa: Zarejestrowani
Postów: 51
Pomógł: 1
Dołączył: 7.02.2013

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


Witam,
próbuję stworzyć zapytanie, które pobierze wiadomości obecnie zalogowanego użytkownika.

Struktura tabel:
  1. CREATE TABLE `konwersacje` (
  2. `konwersacja_id` int(8) NOT NULL,
  3. `konwersacja_temat` varchar(150) NOT NULL
  4. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  5. ALTER TABLE `konwersacje`
  6. ADD PRIMARY KEY (`konwersacja_id`);
  7. ALTER TABLE `konwersacje`
  8. MODIFY `konwersacja_id` int(8) NOT NULL AUTO_INCREMENT;
  9.  
  10. CREATE TABLE `konwersacje_czlonkowie` (
  11. `id` int(11) NOT NULL,
  12. `konwersacja_id` int(8) NOT NULL,
  13. `uzytkownik_id` int(11) NOT NULL,
  14. `konwersacja_ostatnio_ogladana` int(10) NOT NULL,
  15. `konwersacja_usunieta` int(1) NOT NULL
  16. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  17. ALTER TABLE `konwersacje_czlonkowie`
  18. ADD PRIMARY KEY (`id`),
  19. ADD UNIQUE KEY `unikalny` (`konwersacja_id`,`uzytkownik_id`),
  20. ADD KEY `FK_uzytkownicy_konwersacje_czlonkowie1` (`uzytkownik_id`);
  21. ALTER TABLE `konwersacje_czlonkowie`
  22. MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;
  23. ALTER TABLE `konwersacje_czlonkowie`
  24. ADD CONSTRAINT `FK_uzytkownicy_konwersacje_czlonkowie1` FOREIGN KEY (`uzytkownik_id`) REFERENCES `uzytkownicy` (`uzytkownik_id`) ON UPDATE CASCADE;
  25.  
  26. CREATE TABLE `konwersacje_wiadomosci` (
  27. `wiadomosc_id` int(10) NOT NULL,
  28. `konwersacja_id` int(8) NOT NULL,
  29. `uzytkownik_id` int(11) NOT NULL,
  30. `data_wyslania` int(10) NOT NULL,
  31. `wiadomosc_ogladana` int(1) NOT NULL DEFAULT '0',
  32. `wiadomosc_tresc` text NOT NULL
  33. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  34. ALTER TABLE `konwersacje_wiadomosci`
  35. ADD PRIMARY KEY (`wiadomosc_id`),
  36. ADD KEY `konwersacja_id` (`konwersacja_id`),
  37. ADD KEY `uzytkownik_id` (`uzytkownik_id`);
  38. ALTER TABLE `konwersacje_wiadomosci`
  39. MODIFY `wiadomosc_id` int(10) NOT NULL AUTO_INCREMENT;
  40. ALTER TABLE `konwersacje_wiadomosci`
  41. ADD CONSTRAINT `FK_uzytkownicy_konwersacje_wiadomosci` FOREIGN KEY (`uzytkownik_id`) REFERENCES `uzytkownicy` (`uzytkownik_id`) ON UPDATE CASCADE;
  42.  
  43. CREATE TABLE `uzytkownicy` (
  44. `uzytkownik_id` int(11) NOT NULL,
  45. `login` varchar(32) NOT NULL,
  46. `haslo` varchar(255) NOT NULL,
  47. `imie` varchar(55) NOT NULL,
  48. `nazwisko` varchar(80) NOT NULL,
  49. `tel_komorkowy` varchar(25) NOT NULL DEFAULT '',
  50. `tel_stacjonarny` varchar(25) NOT NULL DEFAULT '',
  51. `email` varchar(200) NOT NULL,
  52. `firma_id` int(1) NOT NULL DEFAULT '0',
  53. `pozwol_email` int(1) NOT NULL DEFAULT '0',
  54. `uprawnienia` int(1) NOT NULL DEFAULT '0',
  55. `ostatnie_logowanie` datetime DEFAULT NULL,
  56. `zdjecie` varchar(150) DEFAULT NULL,
  57. `typ` enum('Normalny','Pracownik','Administrator','Super-Administrator') NOT NULL DEFAULT 'Normalny',
  58. `aktywny` int(1) NOT NULL DEFAULT '0'
  59. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  60. ALTER TABLE `uzytkownicy`
  61. ADD PRIMARY KEY (`uzytkownik_id`),
  62. ADD UNIQUE KEY `login` (`login`),
  63. ADD KEY `firma_id` (`firma_id`);
  64. ALTER TABLE `uzytkownicy`
  65. MODIFY `uzytkownik_id` int(11) NOT NULL AUTO_INCREMENT;
  66. ALTER TABLE `uzytkownicy`
  67. ADD CONSTRAINT `FK_firmy_uzytkownicy` FOREIGN KEY (`firma_id`) REFERENCES `firmy` (`firma_id`) ON UPDATE CASCADE;


I przyznam, że się pogubiłem. Czy ktoś może mi pomóc/nakierować?
funkcja nad którą pracuję:
  1. function zlicz_wiadomosci_nieprzeczytane($uzytkownik_id) {
  2. global $connect;
  3.  
  4. $uzytkownik_id = (int)$uzytkownik_id;
  5.  
  6. $sql = "SELECT
  7. COUNT(konwersacje_wiadomosci.wiadomosc_ogladana) AS nieczytana
  8. FROM konwersacje_wiadomosci, konwersacje_czlonkowie
  9. WHERE konwersacje_wiadomosci.uzytkownik_id = {$_SESSION['uzytkownik_id']}
  10. AND konwersacje_wiadomosci.wiadomosc_ogladana = 0
  11. AND konwersacje_czlonkowie.konwersacja_ostatnio_ogladana = 0
  12. ";
  13.  
  14. $wynik = mysqli_query($connect, $sql);
  15.  
  16. if($wynik === FALSE) {
  17. die(mysqli_error($connect));
  18. } else {
  19. if($row = mysqli_fetch_row($wynik)) {
  20. return $row[0];
  21. }
  22. }
  23.  
  24. }
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
pmir13
post
Post #2





Grupa: Zarejestrowani
Postów: 282
Pomógł: 89
Dołączył: 12.04.2011

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


Zakładając że wiadomość nieprzeczytana to taka, która ma datę dodania większą (późniejszą) niż ostatnia data oglądania konwersacji przez danego użytkownika i znajduje się w tej konwersacji to można:
  1. SELECT count(*) AS nieprzeczytane
  2. FROM konwersacje_czlonkowie kc JOIN konwersacje_wiadomosci kw
  3. ON kc.konwersacja_id = kw.konwersacja_id
  4. AND kc.konwersacja_ostatnio_ogladana < kw.data_wyslania
  5. WHERE kc.uzytkownik_id = ?

Pole wiadomosc_ogladana w tabeli konwersacje_wiadomosci jest do usunięcia, nie ma tam sensu.
Nie sprawdzasz też nigdzie czy konwersacja została usunięta, ale to już musisz sam przemyśleć jak to zrobić, bo być może to pole powinno być w tabeli konwersacje albo też użytkownik może chcieć się wypisać z danej konwersacji i tylko dla niego jest ona niewidoczna (usunięta) podczas gdy inni mogą dalej w niej pisać i wtedy to pole jest w dobrym miejscu, choć dziwnie nazwane.
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 13.10.2025 - 13:17