繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM