Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL-如何使用(左)连接通过一个表将两个表连接在一起? 一些背景和目标_Php_Mysql_Join - Fatal编程技术网

Php MySQL-如何使用(左)连接通过一个表将两个表连接在一起? 一些背景和目标

Php MySQL-如何使用(左)连接通过一个表将两个表连接在一起? 一些背景和目标,php,mysql,join,Php,Mysql,Join,我正在用HTML/PHP为我的网站上的一个人建立一个链接列表。它允许使用多个属性选择多个选项,基本上如下所示: ╔══════════╗ ║ Facebook ║ ╠══════════╣ ║ Google+ ║ ╠══════════╣ ║ Twitter ║ ╚══════════╝ ╔═════════════════════╗ ║ Facebook (SELECTED) ║ ╠═════════════════════╣ ║ Google+ (SELECTED) ║ ╠═════

我正在用HTML/PHP为我的网站上的一个人建立一个链接列表。它允许使用多个属性选择多个选项,基本上如下所示:

╔══════════╗
║ Facebook ║
╠══════════╣
║ Google+  ║
╠══════════╣
║ Twitter  ║
╚══════════╝
╔═════════════════════╗
║ Facebook (SELECTED) ║
╠═════════════════════╣
║ Google+  (SELECTED) ║
╠═════════════════════╣
║ Twitter             ║
╚═════════════════════╝
选定的项目将保存到MySQL数据库中,但这还不是全部。保存选择后,我想返回并查看选择了哪些选择。这意味着我必须用我选择的选项在PHP中生成这个select元素

数据库的结构 最后一次编辑于2015年6月24日芬兰时间13:23

在MySQL中,我有以下表格:

链接包括链接特定信息链接地址、颜色等。 person包括关于某人的姓名、地址、电子邮件等信息。 person\u link用作连接表link和person的表,其中包含id\u link和id\u person列 下面的表格试图显示与此问题相关的列;数据是任意的,此处仅用于演示:

链接

个人链接

问题 简言之,我的问题是,我无法在MySQL中组合一个适当的查询来实现期望的目标。我已经看到了很多关于两个表之间的左连接的问题,但是没有遇到一个额外的表将两个表连接在一起的问题

我尝试了以下方法:

SELECT link.name, person.id
    FROM link
        LEFT JOIN person_link ON (link.id = person_link.id_link)
        JOIN person ON (person_link.id_person = person.id)
    WHERE person.id = 2
现在,我希望这种查询在左侧列出所有链接,并在右侧并列一个特定人员的id(如果可用)。如果id与链接匹配,则此链接已从select元素中选择。这就是我想要的结果,NULL表示缺少匹配:

╔══════════╦══════╗
║ Facebook ║  2   ║
╠══════════╬══════╣
║ Google+  ║  2   ║
╠══════════╬══════╣
║ Twitter  ║ NULL ║
╚══════════╩══════╝
为什么我想让桌子看起来像这样?因为基于此表,我可以生成如下所示的select元素:

╔══════════╗
║ Facebook ║
╠══════════╣
║ Google+  ║
╠══════════╣
║ Twitter  ║
╚══════════╝
╔═════════════════════╗
║ Facebook (SELECTED) ║
╠═════════════════════╣
║ Google+  (SELECTED) ║
╠═════════════════════╣
║ Twitter             ║
╚═════════════════════╝
但是,查询没有成功,我的结果是:

╔══════════╦══════╗
║ Facebook ║  2   ║
╠══════════╬══════╣
║ Google+  ║  2   ║
╚══════════╩══════╝
我的问题显然有问题,但我不知道是什么问题。所以,我的问题是,如何使用LEFT JOIN通过一个表将两个表连接在一起?

我建议您

SELECT link.name, person_link.id_person FROM link LEFT JOIN person_link 
ON link.id = person_link.id_link WHERE person_link.id_person = 2

您需要允许此人为空:

SELECT link.name, person.id
FROM link
LEFT JOIN person_link ON (link.id = person_link.id_link)
LEFT JOIN person ON (person_link.id_person = person.id)
WHERE (person.id = 2 OR person.id IS NULL)
您也可以这样写:

SELECT link.name, person.id
FROM link
LEFT JOIN person_link ON (link.id = person_link.id_link)
LEFT JOIN person ON (person_link.id_person = person.id AND person.id = 2)
还是根据尼拉拉的回答

SELECT l.name, pl.id_person
FROM link l
LEFT JOIN person_link pl 
    ON (l.id = pl.id_link && pl.id_person = 2)
group by l.link

一些示例数据可能很好,但从我的角度来看,这个未经测试的查询应该可以完成这项工作

SELECT person.*, link.* 
FROM person_link 
RIGHT JOIN link ON id_link = link.id 
INNER JOIN person ON id_person = person.id
WHERE id_person = 2

嗯,它似乎输出了错误的结果,我已经张贴在我的问题。我想知道主键(由id_link和id_person in person_link-table组成)是否会出现问题?另外,你能解释一下为什么这应该可以代替我提供的查询吗?这是一个更优化的查询。如果你在两个表中得到你想要的结果,那么为什么要查询3个表。我之所以使用3个表,是因为每个人可以拥有的链接数量是不同的。在person表中将每个链接类型设置为自己的列是没有意义的。相反,我会使用person_link-table将一个人连接到他的链接列表。这有意义吗?如果不是,您会推荐一种更好的方法吗你的问题中没有提到这些老东西。我刚刚优化了您的查询,您可以根据需要修改我的查询。您向我们展示所有三个表的表结构和所需的结果集,我将为您提供精确的查询。好吗?好吧,这起作用了。现在我想知道为什么。想学习,不只是简单的复制和粘贴。还在学习DHmm,谢谢你提到SQLFiddle。似乎是一个方便的提问工具
SELECT l.name, pl.id_person
FROM link l
LEFT JOIN person_link pl 
    ON (l.id = pl.id_link && pl.id_person = 2)
group by l.link
SELECT person.*, link.* 
FROM person_link 
RIGHT JOIN link ON id_link = link.id 
INNER JOIN person ON id_person = person.id
WHERE id_person = 2