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