2010-11-26 7 views
0

私は値を得るために2つの要求をしています。私の意見では、1つは速くなるでしょう。私は最良の方法は、結合を使用することだと思う。これは私のコードです:左ジョイント、内ジョイント、何でも参加できますか?

$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];` 

どのようにこれらの2つの要求を1つにマージできますか?

多くのありがとうアドバンス!

答えて

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

しかし、あなたの質問は奇妙です。 uidは一意ですか? fidは一意ですか?それ以外の場合は、「ランダム」な線を選択します。

基本的に、私のクエリはTable2とuidカラムを使用して結合し、mail = $ account-> mailとfid = 16のローを取ります。したがって、複数のローがある場合は、どちらが選択されるかを示します。

0

クエリは次のようになります。

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

は、行のデータをつかむ:

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

これはデカルト製品です。 $ uid変数は最初のクエリのものですから、 'TABLE2.uid = TABLE1.uid'と書いたかったと思います。しかし、正直言って、私は古い構文のファンではなく、INNER JOIN(またはNATURAL INNER JOIN)の構文ははるかに明確です。 –

+0

@Vincent Savard:理論上、デカルト積はありますが、それを防ぐには「制限1」しないでください。 – thejh

+0

@thejh:それはまだデカルト積であるので、どの行が最初にマッチするのか分かりません。しかし、$ uidが存在しないので、とにかく動作しません(私が言ったように、彼の最初のクエリからです)。 –

0

その他の構文を提供してきたので、私はその部分を繰り返すことはしません。しかし、使用する結合のタイプについては、

上記で得られるものを得るには、left joinをTABLE1と一緒に結合の最初のテーブルとして使用します。

サンプルでは、​​常にuidとなり、valueが得られる場合があります。左結合を使用すると、TABLE1からの結果(uid)とTABLE2からの一致する行(value)が返されるという同じ結果が得られます。もちろん、それはmailの値が一致したと仮定しています。

注:私がその使用方法を理解しているので、LIMIT 1を使用すると、メール列に一意の制約がないと問題が隠される可能性があります。同じメール値を持つTABLE1に2つの行がある場合、このクエリではそれを知ることはできません。場合によっては、システムのバグかもしれません。

関連する問題