2010-11-26 17 views
0

Ich mache zwei Anfrage, um einen Wert zu bekommen. Meiner Meinung nach wäre man schneller. Ich denke, der beste Weg ist, mitzumachen. Dies ist mein Code:Linke beitreten, innere verbinden, beitreten?

$uid = db_query("SELECT uid FROM TABLE1 WHERE mail = '{$account->mail}' LIMIT 1"); 
$row = mysql_fetch_array($uid); 
$uid = $row[0]; 


$brief = db_query("SELECT value FROM Table2 WHERE uid = '{$uid}' AND fid = '16' LIMIT 1"); 
$row = mysql_fetch_array($brief); 
$brief = $row[0];` 

Wie kann ich diese beiden Anforderungen zu einem zusammenführen?

Vielen Dank im Voraus!

Antwort

2
SELECT value, ui 
     FROM TABLE1 T1 
INNER JOIN Table2 T2 
    USING (uid) 
    WHERE mail = '{$account->mail}' 
     AND fid = 16 
    LIMIT 1 

Aber Ihre Fragen sind seltsam. Ist uid einzigartig? Ist fid einzigartig? Andernfalls wird eine zufällige Zeile ausgewählt.

Grundsätzlich verbindet meine Abfrage TABLE1 mit Table2 mit der Spalte uid, und es dauert nur Zeilen, in denen Mail = $ account-> mail und fid = 16. Wenn es mehr als eine Zeile gibt, können Sie nicht sicher sein welches wird ausgewählt werden.

0

Die Abfrage wäre:

SELECT TABLE1.uid,TABLE2.value 
FROM TABLE1,TABLE2 
WHERE TABLE1.mail = '{$account->mail}' 
    AND TABLE2.uid = TABLE1.uid 
    AND TABLE2.fid = '16' 
LIMIT 1 

die Daten aus der Zeile Grabbing:

$uid = $row[0]; 
$brief = $row[1]; 
+2

Dies ist ein kartesisches Produkt. $ uid-Variable ist von der ersten Abfrage, ich glaube, Sie wollten 'TABLE2.uid = TABLE1.uid' schreiben. Aber um ehrlich zu sein, ich bin kein Fan der alten Syntax, die Syntax mit INNER JOIN (oder NATURAL INNER JOIN) ist viel klarer. –

+0

@Vincent Savard: Ja, es ist theoretisch ein kartesisches Produkt, aber verhindert "LIMIT 1" das nicht? – thejh

+0

@thejh: Es ist immer noch ein kartesisches Produkt, Sie haben keine Ahnung, welche Zeile zuerst abgeglichen wird. Aber es wird sowieso nicht funktionieren, weil $ uid nicht existiert (wie gesagt, es ist von seiner ersten Abfrage). –

0

Andere Syntax zur Verfügung gestellt haben, so dass ich nicht, dass ein Teil wiederholen. Aber in Bezug auf welche Art von Join zu verwenden:

Um buchstäblich zu bekommen, was Sie mit dem oben genannten erhalten würden, würden Sie eine left join mit TABLE1 als die erste Tabelle in der Join verwenden.

In Ihrer Probe erhalten Sie immer uid und Sie erhalten value. Ein linker Join würde Ihnen dasselbe Ergebnis liefern, da Sie immer ein Ergebnis (uid) von TABLE1 und die Zeile (n) (value), die aus TABLE2 übereinstimmten, zurück erhalten würden. Natürlich wird davon ausgegangen, dass ein Wert für mail gefunden wurde.

Ein Hinweis: Wie ich seine Verwendung verstehe, könnte die Verwendung von LIMIT 1 ein Problem maskieren, wenn Sie keine eindeutige Einschränkung für die E-Mail-Spalte haben. Wenn in TABLE1 zwei Zeilen mit demselben E-Mail-Wert vorhanden wären, würden Sie diese Abfrage nie kennen. In einigen Fällen kann dies ein Fehler in Ihrem System sein.