我试图在两个单独的表中选择所有字段,只要它们共享一个公共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中的特定客户端,如果没有链接,我希望无论如何都要显示容器。
希望我已经清楚地表达了自己,任何指向正确方向的人都会受到赞赏。谢谢!
答案 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”,它将返回您要查找的结果。