2012-06-02 27 views
1

所以,我有这个MySQL问题。加入哪里可以加入,否则不加入

我一直在看LEFT JOIN,INNER JOIN等。而且据我所知LEFT JOIN从左侧连接,如果右侧部分不存在,它的值将设置为NULL。如果没有匹配连接,则使用INNER JOIN,返回空集。

正如你在前面的陈述中看到的,我加入了不同的统计数据等等。但如果uid2不是朋友与uid1这将在我的情况下为null在我的情况下在朋友的所有领域。*

如何才能得到所有的朋友字段,如果他们是朋友,没有字段从friends,如果他们没有。 (我不想在之前做一个单独的声明来检查他们是否是朋友)。

这是我以前statemenet:

SELECT matches.*, statistics.*, friends.*, users.username 
FROM `matches` 
LEFT JOIN statistics ON matches.uid1=statistics.uid 
LEFT JOIN users ON matches.uid1=users.uid 
LEFT JOIN friends ON matches.uid1=friends.fid AND matches.uid2=friends.uid 
WHERE matches.mid IN (269,231,131) 
+0

您可以发布一些示例输出以显示您想要实现的功能吗? – liquorvicar

回答

1

然后你只用INNER JOIN替换最后LEFT JOIN

SELECT matches.*, statistics.*, friends.*, users.username 
FROM `matches` 
LEFT JOIN statistics ON matches.uid1=statistics.uid 
LEFT JOIN users ON matches.uid1=users.uid 
INNER JOIN friends ON matches.uid1=friends.fid AND matches.uid2=friends.uid 
WHERE matches.mid IN (269,231,131); 

然而,这是不可能的选择不是从friends返回表中的列当他们不能加入时。

+0

不,因为它然后会返回一个空集,我反而希望除了朋友列以外的所有其他东西。*' – netigger

+0

@DavidEverlöf您不能在一个查询中更改要返回的列,但 –

+0

好的,谢谢! – netigger

0

我最后还是做了一个LEFT JOIN,然后过滤结果;

$temp = array_filter($temp, "is_not_null"); 

function is_not_null($var) 
{ 
    return ! is_null($var); 
}