【问题标题】:Join two tables and get from one table a array of values连接两个表并从一个表中获取一组值
【发布时间】:2016-10-18 18:49:18
【问题描述】:

我有两个表:一个,表显示星期几和当天的。 餐桌汤,有一个可能的汤的列表。

+-----+------------+--------+
| id  | day        |id_soup |
+-----+------------+--------+
| 1   | Friday     | 1      |
| 2   | Saturday   | 1      |
| 3   | Sunday     | 2      |
+-----+------------+--------+

+-----+------------+
| id  | soup       | 
+-----+------------+
| 1   | potatoes   | 
| 2   | carrots    | 
| 3   | peas       |
+-----+------------+

要获得星期五汤(字符串不是 id),我可以使用这样的查询:

SELECT ma.id, ma.day, ma.id_soup, so.soup
FROM main ma, soup so
WHERE ma.id_soup = so.id
AND ma.id = 1

我得到这样的东西(输出)

+-----+------------+---------+----------+
| id  | day        | id_soup | soup     |
+-----+------------+---------+----------+
| 1   | Friday     | 1       | potatoes |
+-----+------------+---------+----------+

如果星期五只有一汤,这很有效。

问题是周五将提供两种汤(土豆和豌豆 - 一系列汤)

我们需要另一张桌子吗?

已编辑

+-----+---------+---------+
| id  | id_day  | id_soup |     
+-----+---------+---------+
| 1   | 1       | 1       |
| 2   | 1       | 2       |
| 3   | 2       | 2       |
| 4   | 2       | 3       |
| 5   | 3       | 1       |
| 6   | 3       | 3       |
+-----+---------+---------+

有可能在一次查询中,除了主表的其他字段(id、day、id_soup)之外,还可以获得soups数组(potatoes、peas)?

构建此查询的最佳方法是什么?

已编辑:

期望的输出(仅用于说明):

+-----+------------+---------+------------------+
| id  | day        | id_soup | soup             |
+-----+------------+---------+------------------+
| 1   | Friday     | 1       | potatoes, peas   |
+-----+------------+---------+------------------+

已编辑

问题:如果想要的输出是这样的:

+-----+------------+-------------------+
| id  | day        | soup              |
+-----+------------+---------+---------+
| 1   | Friday     | potatoes, carrots |
+-----+------------+---------+---------+
| 2   | Saturday   | carrots, peas     |
+-----+------------+---------+---------+
| 3   | Sunday     | potatoes, peas    |
+-----+------------+---------+---------+

【问题讨论】:

  • 你想要的输出是什么...
  • 您应该尝试将您的数据与提供的示例相匹配。在这种情况下,星期五应该吃土豆和豌豆。还请标记您的第三张桌子。如果你有第三张桌子,那么你不需要MAIN tbale 上的汤 ID
  • 谢谢 Teja。我编辑了我的小提琴。
  • 为什么需要数组?为什么 id_soup 也没有数组?
  • 谢谢胡安。这个例子是虚构的。在客户端显示的是当天(星期五)和当天的汤列表(土豆、豌豆)

标签: mysql sql join


【解决方案1】:

是的,如果每天有多种汤,您将需要一张中间餐桌。 您可以在 SELECT 语句中使用 GROUP_CONCAT 将一天内的所有汤汁调配。

http://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat

SELECT ma.id, ma.day, GROUP_CONCAT(DISTINCT so.soup) as soup
FROM main ma
LEFT JOIN soupmain sm ON(ma.id = sm.id_main)
LEFT JOIN soup so ON(so.id = sm.id_soup)
WHERE ma.id = 1
GROUP BY ma.id

【讨论】:

  • 谢谢西蒙,我会在我的查询中尝试(这部分是一个细节),看看我是否可以让它以这种方式工作,并得到所需的输出。再次感谢。
  • 我编辑了我的帖子。这些解决方案运作良好。为了更好地研究这部分 SQL,我怀疑实现子句 GROUP_CONCAT 的最佳方法是什么,但要获取所有主表(周五、周六和周日)汤。有什么建议吗?
  • 那么就不要放WHERE,你会从主表中得到所有的天数
【解决方案2】:

你可以使用 group_concat

SELECT ma.day,  groupconcat(so.soup)
FROM main ma, soup so
WHERE ma.id_soup = so.id
AND ma.id = 1
group by ma.day

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-28
    • 2010-10-24
    • 1970-01-01
    • 2017-04-29
    • 2020-11-22
    • 1970-01-01
    相关资源
    最近更新 更多