php - MySQL - 如何使用(LEFT)JOIN 通过一个表将两个表连接在一起?

标签 php mysql join

一些背景和目标

我用 HTML/PHP 为我网站上的某个人整理了一个链接列表。它允许多项选择(使用属性“multiple”进行选择),它基本上看起来像这样:

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

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

数据库结构

最后编辑于 6.24.2015 13:23(芬兰时间)

MySQL 中,我有以下表格:

  1. 链接包括链接特定信息(链接地址、颜色等)
  2. person 包括关于一个人的信息(名字和姓氏、地址、电子邮件等)
  3. person_link 用作将表 linkperson 连接在一起的表(具有列 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    ║ 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 通过一个表将两个表连接在一起?

最佳答案

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/

相关文章:

mysql - 如何在选择查询rails或sql查询中使用trim

MySQL - 联合还是加入?

php - 索纳塔管理过滤器 : Invalid parameter number: number of bound variables does not match number of tokens

php - 在 Laravel 5.6 中传递的 Vue Prop

Javascript, CSS - 模式 id while loop unique id

mysql - SQL 查询给定日期范围之前和之后的 x 日期

带有 case 语句的 mysql 查询

PHP session + MySQL 资源

MySQL删除并加入

mysql - 我需要从连接的表中获取所有记录,其中至少有一个有条件的情况