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

Php 从两个表中提取MySQL查询,显示在正确的字段中,php,mysql,select,join,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='li

我试图选择两个单独表中的所有字段,只要它们共享一个公共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>";
        };
//mysql查询
$result=mysql\u查询(“从项目、链接中选择*
其中project.id=links.id和project.id=$clientID”)
//显示链接
如果($row['url']!=null){
呼应“链接”;
回声“;
}
否则{
回声“;
};
如您所见,我的表是“项目”和“链接”,每个表共享一个公共字段“id”供参考。看起来好像在
links.id和project.id都相等的地方,它会输出任何东西,但是当没有与给定的
$clientID
关联的
links.id
时,相对于$clientID的容器根本不会显示

基本上,我用它来动态添加链接到CMS中的特定客户端,如果没有链接,我希望容器显示出来


希望我已经清楚地表达了自己的观点,任何指向正确方向的指点都是值得赞赏的。谢谢

使用SQL ANSI显式联接语法,您可以指定一个
左外部联接
,而不是在隐式联接中执行的
内部联接

即使联接表中没有匹配的行,左外部联接也会在第一个表中返回结果:

SELECT * FROM project
LEFT OUTER JOIN links 
ON links.id = project.id
WHERE project.id = $clientID
对于链接表中没有匹配id的行,links.id将为
NULL

编辑

如果只需要第一个链接,其中autoincrement主键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
从项目中选择*
左外连接链接
ON links.id=project.id
左外连接链接l2
在l2.id=project.id和l2.linkid

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

使用SQL ANSI显式联接语法,可以指定一个
左外部联接,而不是隐式联接中的
内部联接

即使联接表中没有匹配的行,左外部联接也会在第一个表中返回结果:

SELECT * FROM project
LEFT OUTER JOIN links 
ON links.id = project.id
WHERE project.id = $clientID
对于链接表中没有匹配id的行,links.id将为
NULL

编辑

如果只需要第一个链接,其中autoincrement主键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
从项目中选择*
左外连接链接
ON links.id=project.id
左外连接链接l2
在l2.id=project.id和l2.linkid

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

您的查询实际上是在执行“内部联接”,因此它将只返回两个表中都有匹配id的记录。如果您像Marcus的示例中那样执行“左外部联接”,它将返回您正在查找的结果。

您的查询实际上是在执行“内部联接”,因此它将只返回两个表中都有匹配id的记录。如果您像Marcus的示例中那样执行“左外连接”,它将返回您要查找的结果。

感谢Marcus的回答,尽管这给我留下了一些其他问题需要解决。现在,它正在打开正确的容器,但是在有多个链接的单个客户端ID上,它会显示多个容器,其中一个显示第一个链接,然后使用每个后续链接创建另一个容器link@Matt,链接表中是否有一列指定链接的顺序,以便我们可以找到“第一个”链接?我有一个主键,显然是有序的linkid,这样行吗?@Matt,我已经更新了你第二个问题的答案。这也可以通过子查询完成。嘿,马库斯,我真的很感谢你抽出时间。我实际上想显示所有的链接,如果这个$clientID有100个链接,我想显示所有的链接。。你发布的编辑后的查询实际上会导致显示零链接。谢谢马库斯的回答,尽管这让我还有其他问题需要解决。现在,它正在打开正确的容器,但是在有多个链接的单个客户端ID上,它会显示多个容器,其中一个显示第一个链接,然后使用每个后续链接创建另一个容器link@Matt,链接表中是否有一列指定链接的顺序,以便我们可以找到“第一个”链接?我有一个主键,显然是有序的linkid,这样行吗?@Matt,我已经更新了你第二个问题的答案。这也可以通过子查询完成。嘿,马库斯,我真的很感谢你抽出时间。我实际上想显示所有的链接,如果这个$clientID有100个链接,我想显示所有的链接。。您发布的已编辑查询实际上会导致显示零链接。。