一些背景和目标

我在 HTML/PHP 中为我网站上的某个人整理了一个链接列表。它允许多项选择(选择属性“multiple”),它基本上是这样的:

╔══════════╗
║ Facebook ║
╠══════════╣
║ Google+  ║
╠══════════╣
║ Twitter  ║
╚══════════╝

选定的项目将保存到 MySQL 数据库中,但这还不是全部。保存选择后,我想回去看看,选择了哪些选择。这意味着我必须使用我选择的选项在 PHP 中生成这个 select 元素。

数据库的结构

最后编辑于 2015 年 6 月 24 日 13:23(芬兰时间)

MySQL 中,我有以下表格:
  • 链接 包含链接特定信息(链接地址、颜色等)
  • 包括个人信息(名字和姓氏、地址、电子邮件等)
  • person_link 用作将表 link 和 person 连接在一起的表(有列 id_link 和 id_person)

  • 表格如下(已尝试显示与此问题相关的列;数据是任意的,这里是为了演示):

    链接
    ╔══════════╦════════════╗
    ║ 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    ║ [email protected]    ║
    ╠══════════╬═════════════╬═════════════╬══════════════╬═════════════════╣
    ║ 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 ║
    ╚══════════╩══════╝
    

    为什么我希望 table 看起来像这样?因为基于此表,我可以生成如下所示的选择元素:
    ╔═════════════════════╗
    ║ Facebook (SELECTED) ║
    ╠═════════════════════╣
    ║ Google+  (SELECTED) ║
    ╠═════════════════════╣
    ║ Twitter             ║
    ╚═════════════════════╝
    

    但是,而不是查询成功,我最终得到了这个:
    ╔══════════╦══════╗
    ║ Facebook ║  2   ║
    ╠══════════╬══════╣
    ║ Google+  ║  2   ║
    ╚══════════╩══════╝
    

    我的查询显然有问题,但我不知道它是什么。所以,我的问题是,如何使用(LEFT)JOIN 通过一张表将两张表连接在一起?

    最佳答案

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

    或基于 Nirala 的回答
    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
    

    关于php - MySQL - 如何使用(LEFT)JOIN 通过一个表将两个表连接在一起?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31022614/

    10-11 20:47