2010-11-26 32 views
0

我正在做兩個請求,以獲得一個值。在我看來,會更快。我認爲最好的方法是使用連接。這是我的代碼:左連接,內連接,加入任何東西?

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

但是你的查詢很奇怪。 uid是獨一無二的嗎? fid是獨一無二的嗎?否則,它將選擇一個「隨機」行。

基本上,我的查詢使用uid列將Table1與Table2結合在一起,它只接收郵件= $ 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(或者INNER INNER JOIN)的語法更加清晰。 – 2010-11-26 23:56:24

0

其他人提供的語法,所以我不會重複的部分。但至於要使用什麼類型的連接:

要從字面上得到上述結果,可以使用帶TABLE1的left join作爲連接中的第一個表。

在您的示例中,您總是得到uid,您可能會得到value。左連接會給出相同的結果,因此您總是會從TABLE1和從TABLE2匹配的行(s)(value)得到結果(uid)。當然,假設mail的值是匹配的。

A note:據我瞭解,如果您在郵件列上沒有唯一約束,則使用LIMIT 1可能會掩蓋問題。如果TABLE1中有兩行具有相同的郵件值,則永遠不會知道該查詢。在某些情況下,這可能是您系統中的一個錯誤。