【问题标题】:MYSQL: How to split left join results in multiple rowsMYSQL:如何将左连接结果拆分为多行
【发布时间】:2016-04-15 08:30:35
【问题描述】:

我的表格中有一些数据,如下所示:

用户

user_id  name
1        John
2        William
3        cindy
4        Julian
5        Monique

订完

user_id  book_id
1        1
2        3
3        5
5        10

乙烯基输出

user_id  vinyl_id
1        6
2        7
3        8
4        9

我想要一个会产生此输出的 SELECT 语句:

user_id  item_out
1        1 
1        6
2        3
2        7
3        5     
3        8 
4        9
5        10

所以,按照 user_id 和 book_id/vinyl_id 的顺序。这可能吗?

【问题讨论】:

  • 您可以 LEFT JOIN 两个表并使用 IFNULL() 检查要显示的 id。请记住一件事,如果两个表中的 id 相同,您将看不到它是黑胶唱片还是书。
  • 如果我是你,我会在你还可以的时候重组数据库。制作一张表product out 并为类型添加一个枚举列。您现在使用的结构似乎有缺陷,尤其是因为它们似乎共享相同的 id(它们必须是唯一的)
  • @Jester 这个例子不是我真正的生产问题,只是一个简化的例子。在我的真实数据库中,重构数据库并不是那么容易而且更复杂。但你是对的。我应该考虑如何重组这个组件。
  • @johan 两个表确实具有相同的 ID。现在我通过在 select 语句中添加一个带有书籍和乙烯基默认值的额外列来解决这个问题。长期的解决方案是重组数据库。

标签: mysql select join rows


【解决方案1】:

您必须UNION ALL 来自两个单独查询的结果:

SELECT u.user_id, book_id AS item_out
FROM user AS u
INNER JOIN books_out AS b ON u.user_id = b.user_id

UNION ALL

SELECT u.user_id, vinyl_id AS item_out
FROM user AS u
INNER JOIN vinyl_out AS v ON u.user_id = v.user_id
ORDER BY user_id, item_out

第一个查询从books_out 表返回结果,而第二个查询从vinyl_out 表返回结果。

注意: ORDER BY 子句应用于UNION ALL 操作生成的结果集。

Demo here

【讨论】:

  • 谢谢,就像一个魅力。我第一次(需要)使用 UNION ALL。
【解决方案2】:

试试这个 如有错误请评论。

select u.user_id,b.book_id as item_out from user u left join 
 books_out b on u.user_id = b.user_id 
 UNION ALL
 select u.user_id,v.vinyl_id as item_out from user u left join 
 vinyl_out v on u.user_id = v.user_id 
 order by user_id;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-10
    • 2011-02-23
    • 2021-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-14
    相关资源
    最近更新 更多