Zwei SQL Queries zusammenfassen

creativeheadz

Erfahrenes Mitglied
Hallo zusammen,
bastel derzeit an einem Nachrichtensystem. Ich habe folgende Lösung gebastelt um den "Posteingang" anzeigen zu lassen:

PHP:
$query = mysql_query("SELECT *
FROM (SELECT *
FROM app_conversations
WHERE UID_FROM='".$u_id."' OR
UID_TO='".$u_id."'
ORDER BY SENDTIME DESC) AS s
GROUP BY MSG_SESSION");

while($row = mysql_fetch_object($query)){
   
   
   if($row->UID_FROM == $u_id){
     
     $other_uid = $row->UID_TO;
     
   }else{
   
     $other_uid = $row->UID_FROM;
     
   }
   
   $subquery = mysql_query("SELECT * FROM app_user WHERE USER_ID='".$other_uid."'");
   $user = mysql_fetch_object($subquery);
     
   echo '<a href="#message;'.$row->MSG_SESSION.'">'.$user->FNAME.' '.$user->LNAME.'</a><br>';
}


Das ganze ist aber sehr unschön gelöst da ich 2 queries verwende. Ich würde daraus gerne 1 Query machen find aber keinen Ansatz.

Würde mich über Hilfe freuen.

Gruß

c
 
item: Ein Order By im Subselect verlangsamt nur

Ich würde es über ein UNION lösen. Mit dem Union hast du jede Conversation 2 mal drin. A->B und B->A
Dann aknnst du auf den ersten User filtern und hast alle Cenversationen in denen der USer beteiligt ist. In der Spalte uid2 hast du dann immer den Gegenpart. Mit dem kannst du dann in die User-Tabelle gehen.

SQL:
SELECT
   ac.msg_session,
   au.fname,
   au.lname
FROM
   (
     SELECT msg_session, uid_from AS uid1, uid_to AS uid2 FROM   app_conversations
     UNION SELECT msg_session, uid_to AS uid1, uid_from AS uid2 FROM   app_conversations
   ) ac,
   app_user au
WHERE
   ac.uid1 = {$u_id}
   AND ac.uid2 = au.user_id
 
Ok, ich denke, verstanden habe ich es.

PHP:
$query = mysql_query("SELECT
  ac.MSG_SESSION,
  ac.UID_FROM,
  ac.UID_TO,
  au.FNAME,
  au.LNAME,
  au.USER_ID
FROM
  (
  SELECT MSG_SESSION, UID_FROM AS uid1, UID_TO AS uid2 FROM  app_conversations
  UNION SELECT MSG_SESSION, UID_TO AS uid1, UID_FROM AS uid2 FROM  app_conversations
  ) ac,
  app_user au
WHERE
  ac.uid1 = {$u_id}
  AND ac.uid2 = au.USER_ID");
  
  while($row = mysql_fetch_object($query)){
    
       echo '<li>
    <a href="#message;'.$row->MSG_SESSION.'" class="inbox-link">
    <img src="'.$inboxUserImg.'" style="width:60px;">
    '.$row->FNAME.' '.$row->LNAME.'
    </a>
  </li>';
}
echo mysql_error();


Als mysql_error() erhalte ich -> Unknown column 'ac.UID_FROM' in 'field list'

Ich verstehe nicht was ich falsch mache?


EDIT:
Hier mit habe ich es wohl zu gut gemeint. Ich hätte es besser einfach so von dir übernommen. Danke. Es funktioniert hervorragend.

PHP:
  ac.UID_FROM,
  ac.UID_TO,
  au.USER_ID
 
Macht nen JOIN hier nicht mehr Sinn? (Immer wenn ich mysql_query in ner while Schleife sehe krieg ich ne Krise - und zwar doppelt :D:D)
 
Das war der versteckte Hinweis darauf, dass mysql_* veraltet ist in PHP5.5 (aktuelle Version) und nicht mehr benutzt werden sollte.
Ich habe das als frage formuliert, weil Yaslaw sich ziemlich gut auskennt in MYSQL (ich nicht), aber trotzdem glaube ich man könnte hier auch nen JOIN ansetzen :Dl
 
@alxy
FROM a, b WHERE a.id = bid
ist dasselbe wie
FROM a INNER JOIN b ON a.id=b.id

Bei INNER JOIN bevorzuge ich persönlich die Version über den WHERE. Ist mMn besser lesbar. Grad bei Oracle, wo man die LEFT JOIN mit einem + markieren kann
Die Performance-Unterschiede müsste man messen. Sollten aber mMn nicht vorhanden sein
 
Klugscheiß-Mode (sorry yaslaw):

Die Variante über WHERE heißt EQUI JOIN und ist nicht das gleiche wie ein INNER JOIN. Bei einem EQUI-Join gibt es, wie der Name schon sagt, nur Gleichzeichen als Operator. Bei einem INNER-Join kann man auch andere Operatoren wie z.B. <, > oder <> verwenden. Und Performance ist da eigentlich keine Frage sondern eher die Wahl der Möglichkeit nach Art des Vergleichs.

LEFT-Join fällt eigentlich in eine noch komplett andere Kategorie.
/Klugscheiß-Mode


Deine Frage bezgl. der Sortierung. Du könntest im äußeren Query ein ORDER BY für MSG_SESSION einbauen.
 
Zurück