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

时间:2015-06-24 09:20:35

标签: php mysql join

一些背景和目标

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

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

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

数据库的结构

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

MySQL 中,我有以下表格:

  1. 链接包含特定于链接的信息(链接地址,颜色等)
  2. 包含有关某人的信息(姓名,地址,电子邮件等)
  3. person_link 用作将表链接连接在一起的表(包含列 id_link id_person
  4. 表格如下所示(试图显示与此问题相关的列;数据是任意的,此处是为了演示):

    链接

    ╔══════════╦════════════╗
    ║ 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与链接匹配,则已从选择 -element中选择此链接。这就是我想要的结果(NULL代表缺少匹配):

    ╔══════════╦══════╗
    ║ Facebook ║  2   ║
    ╠══════════╬══════╣
    ║ Google+  ║  2   ║
    ╠══════════╬══════╣
    ║ Twitter  ║ NULL ║
    ╚══════════╩══════╝
    

    为什么我希望表格看起来像这样?因为基于这个表我可以生成select-element看起来像这样:

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

    但是,不是查询成功,我最终得到了这个:

    ╔══════════╦══════╗
    ║ Facebook ║  2   ║
    ╠══════════╬══════╣
    ║ Google+  ║  2   ║
    ╚══════════╩══════╝
    

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

4 个答案:

答案 0 :(得分:1)

您需要允许此人为NULL:

NSUserDefaults.standardUserDefaults().setObject(test, forKey: "firmCode")
NSUserDefaults.standardUserDefaults().setObject(test, forKey: "firmId")
NSUserDefaults.standardUserDefaults().setObject(test, forKey: "userId")

您也可以将其写为:

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)

答案 1 :(得分:1)

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

答案 2 :(得分:0)

我建议你

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

答案 3 :(得分:0)

一些示例数据会很好(http://sqlfiddle.com/会很完美),但从我的角度来看,这个未经测试的查询应该可以胜任。

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