[英]MySQL query pulling from two tables, display in correct fields
我试图在两个单独的表中选择所有字段,只要它们共享一个公共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
都相等,它会输出任何内容,但是当没有与给定$clientID
关联的links.id
相对于$clientID
的容器根本不会显示。
本质上,我正在使用它来动态添加到此CMS中特定客户端的链接,如果没有链接,无论如何我都希望容器显示出来。
希望我已经清楚表达了自己的观点,对正确方向的任何指示都表示赞赏。 谢谢!
使用SQL ANSI显式联接语法,可以指定LEFT OUTER JOIN
,而不是在隐式INNER 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最小的链接。
您所查询的实际上是在执行“ INNER JOIN”,因此它将仅返回两个表中具有匹配ID的记录。 如果像Marcus的示例中那样进行“ LEFT OUTER JOIN”,它将返回您想要的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.