MySQL查询从两个表中拉出,显示在正确的字段中

时间:2010-04-27 21:51:52

标签: php mysql select join

我试图在两个单独的表中选择所有字段,只要它们共享一个公共ID即可。

//mysql query
$result = mysql_query("SELECT * FROM project, links 
WHERE project.id = links.id and project.id = $clientID")

//displaying the link 
if ($row['url'] != null){
    echo "<div class='clientsection' id='links'>Links</div>";
    echo "<a class='clientlink' id='link1' href='" . $row['url'] . "'>" . $row['name'] . "</a>";
}
else {
echo "<a class='clientlink' id='link1' href='" . $row['url'] . "' style='display:none;'>" . $row['name'] . "</a>";
        };

如您所见,我的表格是“项目”,“链接”每个人都共享一个公共字段“id”供参考。看起来两个links.id and project.id相等,它输出任何东西,但是当没有links.id与给定的$clientID相关联时,相对于$ clientID的容器根本不显示。

基本上我使用它来动态地将链接添加到此CMS中的特定客户端,如果没有链接,我希望无论如何都要显示容器。

希望我已经清楚地表达了自己,任何指向正确方向的人都会受到赞赏。谢谢!

2 个答案:

答案 0 :(得分:5)

使用SQL ANSI显式连接语法,您可以指定LEFT OUTER JOIN,而不是在隐式连接中执行的INNER JOIN

即使连接表中没有匹配的行,LEFT OUTER JOIN也会在第一个表中返回结果:

SELECT * FROM project
LEFT OUTER JOIN links 
ON links.id = project.id
WHERE project.id = $clientID

对于链接表中没有匹配ID的行,links.id将为NULL

修改

如果你只想要第一个链接,自动增量主键links.linkid指定顺序,你可以像这样进行自我连接:

SELECT * FROM project
LEFT OUTER JOIN links
ON links.id = project.id
LEFT OUTER JOIN links l2
ON l2.id = project.id AND l2.linkid < links.linkid
WHERE project.id = $clientID AND l2.id IS NULL

这样做是连接任何linkid较小的链表行,然后在WHERE子句中排除这些行。您最终只得到没有较小linkid的行,因此每个项目的链接都是最小的linkid。

答案 1 :(得分:1)

您的查询实际上是在进行“内部联接”,因此它只会返回两个表中都存在匹配ID的记录。如果您按照Marcus的例子进行“LEFT OUTER JOIN”,它将返回您要查找的结果。