2010-11-26 92 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中有两行具有相同的邮件值,则永远不会知道该查询。在某些情况下,这可能是您系统中的一个错误。