phpMyAdmin
 sql >> Baza danych >  >> Database Tools >> phpMyAdmin

Tworzenie listy wiadomości w SQL

Myślę, że Twoje zapytanie daje „właściwe” wyniki, tak jakbyś chciał zobaczyć ostatnią wiadomość w niektórych rozmowach, powinieneś naprawdę pogrupować według conversation_id . Jednak nie widzę tego pola w schemacie.

Jeśli zrobisz WHERE sender_id = 3 GROUP BY receiver_id , to jest poprawne, że zapytanie zwraca wiadomości 1 i 7, ponieważ te wiadomości zostały wysłane do innych ludzi, dlatego w twoim projekcie są to różne rozmowy.

Jeśli chcesz ogólnie widzieć tylko ostatnią wiadomość wysłaną przez Ciebie, po prostu usuń GROUP BY w drugiej części twojego UNION . W przeciwnym razie rozważ przeprojektowanie schematu.

EDYTUJ:

Wypróbuj to zapytanie:

SELECT m.message_id, u.username, m.subject, m.message,
       m.status, UNIX_TIMESTAMP(m.date) as `date`
  FROM users u
  LEFT JOIN messages m ON m.sender_id = u.id
 WHERE m.message_id IN (
    SELECT max(message_id) 
      FROM messages
     WHERE receiver_id = 3 OR sender_id = 3
     GROUP BY least(sender_id,receiver_id), 
              greatest(sender_id,receiver_id)
    );

Kilka uwag:

  1. UNION nie jest już potrzebny;
  2. To podejście spowoduje, że wszystkie wiadomości e-mail między 2 stronami będą traktowane jako jedna rozmowa, co nie zawsze jest prawdą. Możesz chcieć przeprojektować to podejście;
  3. Zły styl jest używanie słów zastrzeżonych (takich jak date ) dla nazw kolumn lub aliasów, staraj się tego unikać. Lub użyj backticków, jeśli ich używasz.



  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. phpmyadmin:Nieprawidłowa liczba wierszy w tabeli z MySQL

  2. C# - Zdalne połączenie z bazą danych XAMPP przez LAN

  3. #1146 - Tabela 'phpmyadmin.pma__tracking' nie istnieje jak wyłączyć ręcznie?

  4. phpMyAdmin — czas wykonania zapytania

  5. W Php, aby dynamicznie pobrać nazwę tabeli i pola z pliku csv i zaimportować do MYSQL