2017-05-09 5 views
0

Ich habe zwei Tabellen (Nachrichten und Benutzer). Ich möchte die letzte (msg_id, Text) aus der Nachrichtentabelle für eine bestimmte ad_id auswählen und muss den Namen des Benutzers aus der Benutzertabelle auswählen.Wie wähle ich den letzten Text aus Nachrichtentabelle

SELECT u.id 
    , m.date 
    , m.ad_id 
    , max(m.msg_id)as msg_id 
    , u.first_name 
    , m.text 
    , m.u_to_id 
    , m.u_from_id 
FROM user u 
JOIN messages m 
    ON CASE WHEN m.u_from_id ='14' THEN u.id = m.u_to_id 
      ELSE u.id = m.u_from_id END 
AND (m.u_from_id='14' OR m.u_to_id='14') 
AND m.ad_id='20' 
GROUP BY CONCAT(m.ad_id,u.id) 
ORDER by m.msg_id DESC 

diese Abfrage funktioniert, aber ich kann t die letzte m.text nicht wählen Table structure

Antwort

1
SELECT u.id, m.text 
FROM user u 
JOIN messages m ON m.msg_id = (SELECT max(msg_id) FROM messages WHERE u_from_id = u.id) 

ich vereinfacht Ihre Abfrage die Logik zu Ihrer Frage zu zeigen. Grundsätzlich möchten Sie Ihre Nachrichten Tabelle auf der msg_id, die gleich der inneren Abfrage der max msg_id mit diesem Benutzer ist.

+0

leider ist nicht das erwartete ein. Ich gebe "ON CASE WHEN m.u_from_id = '14 'DANN u.id = m.u_to_id ELSE u.id = m.u_from_id END" weil die Person mit id = '14' die Nachricht liest, anstatt ihren Namen zu wählen Wählen Sie den Namen der anderen Personen. – Sujith

+0

GROUP BY CONCAT (m.ad_id, u.id) wird angegeben, weil mehrere Benutzer eines bestimmten Ad-IDs nicht mehr als eine Nachricht erhalten. Entschuldigung für die Verwirrungen. – Sujith

0

Nach so vielen Versuchen gegeben, um eine neue Spalte (bargainer) für den Empfänger zu identifizieren und diese Abfrage für mich das Abfrageergebnis .. adaequat sagen

select m.msg_id,m.text,m.status,m.date,m.bargainer,m.ad_id,u.first_name,u.id from user u JOIN messages m where msg_id in (select max(msg_id) from messages m where m.ad_id=20 and u.id=m.bargainer group by(m.bargainer))group by(m.msg_id) order by msg_id DESC 
Verwandte Themen