【问题标题】:left join, with only 1 row per left entry左连接,每个左条目只有 1 行
【发布时间】:2012-12-21 16:31:21
【问题描述】:

这是我的表结构:

persons
-------
id
first_name
last_name


phone_numbers
-------------
id
person_id
number
type

这是我的查询:

SELECT `persons`.`id`, `first_name`, `last_name`, `number`
FROM `persons`
LEFT JOIN `phone_numbers` ON `persons`.`id` = `phone_numbers`.`person_id`
ORDER BY `last_name` ASC

这会返回所有人,无论他们是否有电话号码。很好。


当一个人拥有多个电话号码时,问题就开始了;我为同一个人获得了多行。

我如何确保每人只能获得 1 行(带有第一个电话号码,或者根本没有 - 如果没有的话)?


更新:我忘了包括我有一个type 列的事实。它的值可以是以下三种选择之一:

  1. 细胞
  2. 工作
  3. 首页

首先将由该顺序确定。

【问题讨论】:

  • 哪个是“第一个电话号码”?
  • @eggyal - 我怎么能忘记呢?我更新了我的问题。
  • @MegaHit type 是一个数字 1,2,3 还是描述 Cell,Work,Home
  • @fthiella - 这不是一个数字(如果是,这会容易得多)。只是文字。

标签: mysql sql join left-join


【解决方案1】:
SELECT * FROM phone_numbers NATURAL JOIN (
  SELECT   person_id,
           ELT(
             MIN(FIELD(type, 'Cell', 'Work', 'Home')),
             'Cell', 'Work', 'Home'
           ) AS type
  FROM     phone_numbers
  GROUP BY person_id
) t JOIN persons ON persons.id = phone_numbers.person_id

【讨论】:

    猜你喜欢
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2012-02-27
    • 1970-01-01
    相关资源
    最近更新 更多