【发布时间】:2015-09-10 10:08:59
【问题描述】:
一些背景和目标
我正在用 HTML/PHP 为我的网站上的一个人制作一个链接列表。它允许多项选择(使用属性“multiple”进行选择),它基本上看起来像这样:
╔══════════╗
║ Facebook ║
╠══════════╣
║ Google+ ║
╠══════════╣
║ Twitter ║
╚══════════╝
所选项目将保存到 MySQL 数据库中,但这还不是全部。保存选择后,我想回去看看,选择了哪些选择。这意味着我必须使用我选择的选项在 PHP 中生成这个 select-元素。
数据库结构
最后编辑于 2015 年 6 月 24 日 13:23(芬兰时间)
在 MySQL 中,我有以下表格:
- 链接包括链接特定信息(链接地址、颜色等)
- 人包括有关个人的信息(名字和姓氏、地址、电子邮件等)
- person_link 用作将表 link 和 person 连接在一起的表(具有列 id_link 和 id_person em>)
表格如下(已尝试显示与此问题相关的列;数据是任意的,此处是为了演示):
链接
╔══════════╦════════════╗
║ id ║ name ║
╠══════════╬════════════╣
║ 1 ║ Facebook ║
╠══════════╬════════════╣
║ 2 ║ Google+ ║
╠══════════╬════════════╣
║ 3 ║ Twitter ║
╚══════════╩════════════╝
人
╔══════════╦═════════════╦═════════════╦══════════════╦═════════════════╗
║ id ║ name_first ║ name_last ║ address ║ email ║
╠══════════╬═════════════╬═════════════╬══════════════╬═════════════════╣
║ 1 ║ Jack ║ Johnson ║ Wacko Street ║ NULL ║
╠══════════╬═════════════╬═════════════╬══════════════╬═════════════════╣
║ 2 ║ Hanna ║ Hill ║ Hill Town ║ hh@gmail.com ║
╠══════════╬═════════════╬═════════════╬══════════════╬═════════════════╣
║ 3 ║ Eric ║ Samson ║ Wacko Street ║ NULL ║
╚══════════╩═════════════╩═════════════╩══════════════╩═════════════════╝
person_link
╔═══════════╦═════════╦═════════════════════╗
║ id_person ║ id_link ║ address ║
╠═══════════╬═════════╬═════════════════════╣
║ 2 ║ 1 ║ www.example.com ║
╠═══════════╬═════════╬═════════════════════╣
║ 2 ║ 2 ║ www.hello.org ║
╚═══════════╩═════════╩═════════════════════╝
问题
简而言之,我的问题是我无法在 MySQL 中组合适当的查询来实现预期目标。我见过很多关于两个表之间的 LEFT JOIN 的问题,但还没有遇到过将两个表连接在一起的附加表的问题。
我尝试了以下方法:
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 ║
╚══════════╩══════╝
为什么我想让表格看起来像这样?因为基于此表,我可以生成如下所示的选择元素:
╔═════════════════════╗
║ Facebook (SELECTED) ║
╠═════════════════════╣
║ Google+ (SELECTED) ║
╠═════════════════════╣
║ Twitter ║
╚═════════════════════╝
但是,我没有查询成功,而是得到了这样的结果:
╔══════════╦══════╗
║ Facebook ║ 2 ║
╠══════════╬══════╣
║ Google+ ║ 2 ║
╚══════════╩══════╝
我的查询显然有问题,但我不知道是什么问题。所以,我的问题是,如何使用 (LEFT) JOIN 通过一个表将两个表连接在一起?
【问题讨论】: