MySQL - 左连接和Case选择在第一个CASE中设置NULL值

时间:2015-02-02 14:45:19

标签: mysql

方案

我有一个用户表,其中包含用户所在国家/地区的iso_code_2用户列,另一个表格中我有不同语言的所有国家/地区,因此我想要的是获取国家/地区的国家/地区文本。用户居住地和国籍。我知道问题是GROUP BY,但我不知道如何解决它。

/* Users table */
╔══════╦═════════════╦════════════╦═════════════╦═══════════════╗
║  id  ║  firstname  ║  lastname  ║  residence  ║  nationality  ║
╚══════╩═════════════╩════════════╩═════════════╩═══════════════╝
│  1   │     Joe     │    Doe     │     JP      │      PH       │
├──────┼─────────────┼────────────┼─────────────┼───────────────┤
│  2   │    Lisa     │  Simpson   │     US      │      AR       │
├──────┼─────────────┼────────────┼─────────────┼───────────────┤
│  3   │    Homer    │  Simpson   │     JP      │      JP       │
└──────┴─────────────┴────────────┴─────────────┴───────────────┘

/* Countries table */
╔══════╦═══════════════╦══════════════╦═════════════════════╗
║  id  ║  language_id  ║  iso_code_2  ║       country       ║
╚══════╩═══════════════╩══════════════╩═════════════════════╝
│  1   │       1       │      JP      │        Japan        │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  2   │       2       │      JP      │         日本        │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  3   │       1       │      PH      │     Philippines     │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  4   │       2       │      PH      │       フィリピン     │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  5   │       1       │      US      │    United States    │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  6   │       2       │      US      │         米国        │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  7   │       1       │      AR      │      Argentina      │
├──────┼───────────────┼──────────────┼─────────────────────┤
│  8   │       2       │      AR      │     アルゼンチン     │
└──────┴───────────────┴──────────────┴─────────────────────┘

/* Expected results */
╔══════╦═════════════╦════════════╦════════════════════════╦═══════════════════════╗
║  id  ║  firstname  ║  lastname  ║    residence_country   ║  nationality_country  ║
╚══════╩═════════════╩════════════╩════════════════════════╩═══════════════════════╝
│  1   │     Joe     │    Doe     │         Japan          │      Philippines      │
├──────┼─────────────┼────────────┼────────────────────────┼───────────────────────┤
│  1   │    Lisa     │  Simpson   │      United States     │       Argentina       │
├──────┼─────────────┼────────────┼────────────────────────┼───────────────────────┤
│  1   │    Homer    │  Simpson   │         Japan          │         Japan         │
└──────┴─────────────┴────────────┴────────────────────────┴───────────────────────┘

当前查询

SELECT 
    u.id,
    u.firstname,
    u.lastname,
    CASE c.iso_code_2
        WHEN u.nationality THEN c.country
    END AS nationality_country,
    CASE c.iso_code_2
        WHEN u.residence THEN c.country
    END AS residence_country
FROM
    users AS u
        LEFT JOIN
    countries AS c ON c.language_id = 1 WHERE c.iso_code_2 IN (u.nationality, u.residence)
GROUP BY u.id
ORDER BY u.created_at DESC
LIMIT 15

错误的结果

╔══════╦═════════════╦════════════╦════════════════════════╦═══════════════════════╗
║  id  ║  firstname  ║  lastname  ║    residence_country   ║  nationality_country  ║
╚══════╩═════════════╩════════════╩════════════════════════╩═══════════════════════╝
│  1   │     Joe     │    Doe     │         NULL           │      Philippines      │
├──────┼─────────────┼────────────┼────────────────────────┼───────────────────────┤
│  1   │    Lisa     │  Simpson   │         NULL           │       Argentina       │
├──────┼─────────────┼────────────┼────────────────────────┼───────────────────────┤
│  1   │    Homer    │  Simpson   │         NULL           │         Japan         │
└──────┴─────────────┴────────────┴────────────────────────┴───────────────────────┘

1 个答案:

答案 0 :(得分:0)

分组依据在结果中每个用户只保留一行。根据MySQL的偏好,它将包含residence_country或nationality_country。

您需要从国家/地区表格中选择两次才能获得所需的结果(这样可以简化查询)

 SELECT 
    u.id,
    u.firstname,
    u.lastname,
    cn.country
    cr.country
FROM
    users AS u
    LEFT JOIN countries AS cn ON cn.language_id = 1 WHERE cn.iso_code_2 = u.nationality
    LEFT JOIN countries AS cr ON cr.language_id = 1 WHERE cr.iso_code_2 = u.residence