2016-05-30 7 views
0

Ich brauche alle Chats zu wählen, und jetzt bin ich der Auswahl sie mehrere Abfragen wie folgt verwendet:Einzel SQL-Abfrage für die Auswahl Chats

 $query_1 = mysqli_query($database, "SELECT chat_id, user_id_1, user_id_2 
                FROM chat 
                WHERE user_id_1 = '$user_id' OR user_id_2 = '$user_id')"); 

     if (mysqli_num_rows($query_1) > 0) { 
      while ($row = mysqli_fetch_assoc($query_1)) { 
       $chat_id = $row['chat_id']; 
       $user_id_1 = $row['user_id_1']; 
       $user_id_2 = $row['user_id_2']; 

       if ($user_id_1 == $user_id) 
        $user_id_chat = $user_id_2; 
       else 
        $user_id_chat = $user_id_1; 

       $query_2 = mysqli_query($database, "SELECT username 
                   FROM user 
                   WHERE user_id = '$user_id_chat'"); 

       $row2 = mysqli_fetch_assoc($query_2); 
       $username = $row2['username']; 

       $query_3 = mysqli_query($database, "SELECT text, 
                   (SELECT COUNT(message_id) FROM message WHERE chat_id = '$chat_id' AND user_id != '$user_id' AND seen = '0') AS unread_messages 
                   FROM message 
                   WHERE chat_id = '$chat_id' 
                   ORDER BY message_id DESC 
                   LIMIT 1"); 

       $row3 = mysqli_fetch_assoc($query_3); 
       $text = $row3['text']; 
       $unread_messages = $row3['unread_messages']; 
      } 
     } 

Gibt es einen Weg, um all diese ($ chat_id, zu bekommen $ user_id_chat , $ username, $ text und $ unread_messages) mit nur einer Abfrage?

EDIT: Hinzugefügt Beispieldaten und erwartete Ausgabe:

Table user 

user_id  username  ... 
    1   User1  ... 
    2   User2  ... 
    3   User3  ... 
    4   User4  ... 


Table chat 

chat_id  user_id_1  user_id_2  ... 
    1   3   4   ... 
    2   1   3   ... 


Table message 

message_id  chat_id  user_id  text  seen  ... 
    1    1   4  Hi!  1  ... 
    2    2   1  Hello  1  ... 
    3    1   3  hi  0  ... 
    4    2   3  Hi  0  ... 
    5    2   3  How are you? 0  ... 

Wenn $ user_id 1 ist es nur einen Chat und den Wert von chat_id sollte 2 $ sein wird, von $ user_id_chat 3 sein soll, von $ username sollte 'User3' sein, von $ text sollte 'Wie geht es dir?' und von $ unread_messages sollte 2.

+1

Bitte Beispiel Daten hinzufügen und erwartete Ausgabe –

+0

nach Ihrem Code 'Text' und' unread_messages' nicht abhängig ist '$ user_id_chat'. das bedeutet, dass sie für alle wiederkehrenden Datensätze gleich sind. – Alex

+0

Nein, sie sind nicht für alle zurückkehrenden Datensätze gleich, sie hängen von $ chat_id ab. – user3051755

Antwort

1

http://sqlfiddle.com/#!9/8c6cb/8

$query_1 = mysqli_query($database, 
     "SELECT 
     c.chat_id, 
     u.username, 
     COALESCE(m.text,'MY PLACEHOLDER'), 
     COALESCE(um.unread_messages,0) 
     FROM (
     SELECT chat_id, 
       IF(user_id_1 = '$user_id', user_id_2, user_id_1) user_id_chat 
     FROM chat 
     WHERE user_id_1 = '$user_id' OR user_id_2 = '$user_id' 
    ) c 
     LEFT JOIN user u 
     ON u.user_id = c.user_id_chat 
     LEFT JOIN (SELECT chat_id, SUM(seen = '0',1,0) unread_messages, MAX(message_id) max_id 
      FROM message 
      WHERE user_id != '$user_id' 
      GROUP BY chat_id) um 
     ON um.chat_id = c.chat_id 
     LEFT JOIN message m 
     ON m.chat_id = c.chat_id 
     AND m.message_id = um.max_id "); 

if (mysqli_num_rows($query_1) > 0) { 
    while ($row = mysqli_fetch_assoc($query_1)) { 
    $chat_id = $row['chat_id']; 
    $username = $row['username']; 
    $text = $row ['text']; 
    $unread_messages = $row['unread_messages']; 
    } 
} 
+0

Ich bekomme Fehler für diese Abfrage: Unbekannte Spalte 'c.user_id_1' in 'Where-Klausel' – user3051755

+0

überprüfen Sie aktualisierte Abfrage – Alex

+0

Vielen Dank, es funktioniert teilweise. Wenn es keine ungelesenen Nachrichten gibt, gibt die Abfrage NULL zurück, und ich würde sie 0 zurückgeben müssen. Wenn der letzte Text von $ user_id stammt, wird NULL für Text zurückgegeben, und ich würde den letzten Text zurückgeben müssen, egal ob Es stammt von '$ user_id' oder' $ user_id_chat'. Und auch wenn Text leer ist, könnte es benutzerdefinierten Text zurückgeben, so etwas wie "CASE-Text WANN" "THEN 'Bild"? – user3051755

0

So suchen Sie nach einer Möglichkeit, aus zwei Tabellen in einer Abfrage auszuwählen. Dann magst du vielleicht INNER JOIN. Besuchen Sie diesen Link:

http://www.w3schools.com/sql/sql_join_inner.asp

ODER

eine Funktion Stellen wie folgt wählen:

`Funktion wählen ($ query = "SELECT * FROM $ table", $ Limit = 1) {

$row = mysql_query($query); 
    // I'm so lazy to type the other codes, just put ur while loop and other stuff(if any) here 

} ` 

Dies muss dann aufgerufen werden als:

`auswählen (" SELECT chat_id, user_id_1, user_id_2 VON Chat WHERE user_id_1 = '$ user_id' ODER user_id_2 = '$ user_id') ");

select(" (SELECT COUNT(message_id) FROM message WHERE chat_id = '$chat_id' AND user_id != '$user_id' AND seen = '0') AS unread_messages 
                  FROM message 
                  WHERE chat_id = '$chat_id' AND user_id != '$user_id' 
                  ORDER BY message_id DESC 
                  LIMIT 1"); ` 

Dies wird nicht mehrere Where-Schleifen benötigen.

Sorry für schlechte Code-Layout, ich bin ein Neuling hier. Viel Glück!

Verwandte Themen