mysql - 如何在mysql中左连接3个表

标签 mysql sql

我有 3 张 table :

成员(网卡,名称)

奖项(nic,aw_name)

冠军(nic,ch_name)

一个人可以拥有多个奖项或冠军。例如理查德有2个奖项和3个冠军,而史蒂夫没有任何奖项或冠军。

现在我想列出获得奖项和冠军的人员名单。例如:

|    nic   |    name    |   aw_name   |      ch_name      |
|----------|------------|-------------|-------------------|
| 1        | Richard    | award 1     | championship 1    |
| 1        | Richard    | award 2     | championship 2    |
| 1        | Richard    |             | championship 3    |
| 2        | Steve      |             |                   |

谁能帮帮我吗?谢谢!

最佳答案

试试这个:

SELECT
    members.nic,
    members.name,
    awards.aw_name,
    championships.ch_name
FROM
    (
        SELECT
            CASE WHEN @curNic = members.nic THEN @curRow := @curRow + 1 ELSE @curRow := 1 END num,
            @curNic := members.nic nic,
            name
        FROM
            members LEFT JOIN
            (
                SELECT nic FROM awards UNION ALL
                SELECT nic FROM championships
            ) tmp ON tmp.nic = members.nic JOIN
            (SELECT @curNic := null, @curRow := 0) r
    ) members LEFT JOIN
    (
        SELECT
            CASE WHEN @curNic1 = nic THEN @curRow1 := @curRow1 + 1 ELSE @curRow1 := 1 END num,
            @curNic1 := nic nic,
            aw_name
        FROM
            awards JOIN
            (SELECT @curNic1 := null, @curRow1 := 0) r
    ) awards ON awards.nic = members.nic AND awards.num = members.num LEFT JOIN
    (
        SELECT
            CASE WHEN @curNic2 = nic THEN @curRow2 := @curRow2 + 1 ELSE @curRow2 := 1 END num,
            @curNic2 := nic nic,
            ch_name
        FROM
            championships JOIN
            (SELECT @curNic2 := null, @curRow2 := 0) r
    ) championships ON championships.nic = members.nic AND championships.num = members.num
WHERE
    awards.nic IS NOT NULL OR championships.nic IS NOT NULL OR members.num = 1

如果mysql中有FULL OUTER JOIN会更容易,但是没有。

fiddle :http://www.sqlfiddle.com/#!2/31d47/43

关于mysql - 如何在mysql中左连接3个表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20043720/

相关文章:

sql - 通过 LoginRoles 与表在 Web 应用程序上进行 Postgres 用户身份验证

sql - SELECT FOR XML AUTO 并返回数据类型

mysql - 如何在 SQL 中连接多个需要按时间过滤的表?

mysql - 新手: How to do update with id in cakephp2 mysql?

mysql - 执行查询以获取数据行中 user_id id 的前 3 次出现?

php - 将动态字段数据插入数据库问题?

mysql - 我的sql查询在where子句的某些条件下获取所有行

javascript - 如何同时禁用和启用单选按钮

sql - 如何使用SQLite数据库设计“上周播放次数最多”排名?

MySql存储过程,逻辑上或物理上删除依赖于现有表引用的记录