MySQL动态内部联接将多行合并为一个?

时间:2014-01-22 07:44:32

标签: mysql sql

我正在使用下表创建一个数据库,其中小时中的shop_id指的是商店中的ID。
我最好有一个查询来返回一行中的所有数据,而不是需要后处理很多行来“合并”小时的结果,所以最终结果看起来像这样。

+-------------------+---------+------+---------+----------------+----------+---------------+---------------+-----+-----+-----+-----+-----+-----+-----+
| name              | address | zip  | city    | municipal      | phone    | lat           | lng           | day | day | day | day | day | day | day |
+-------------------+---------+------+---------+----------------+----------+---------------+---------------+-----+-----+-----+-----+-----+-----+-----+
| Coop Marked Budal | false   | 7298 | Budalen | Midtre gauldal | 72436410 | 62.8837013245 | 10.4836997986 |   1 |   2 |   3 |   4 |   5 |   6 |   7 |
+-------------------+---------+------+---------+----------------+----------+---------------+---------------+-----+-----+-----+-----+-----+-----+-----+

现在我来到下面的查询,我觉得必须有更好的选择。所以我的问题是:还有其他解决办法吗?
此外,我已经看过concat,但我希望以后在处理数据时不必拆分字符串。

select shop.name, shop.address, shop.zip, shop.city, shop.municipal, shop.phone, shop.lat, shop.lng,
h.day, hh.day, hhh.day, hhhh.day, hhhhh.day, hhhhhh.day, hhhhhhh.day
from shop
/**
As it requires a unique table name, this was the solution I found.
Could this be shortened?
**/
inner join hours h on shop.id = h.shop_id and h.day = 1
inner join hours hh on shop.id = hh.shop_id and hh.day = 2
inner join hours hhh on shop.id = hhh.shop_id and hhh.day = 3
inner join hours hhhh on shop.id = hhhh.shop_id and hhhh.day = 4
inner join hours hhhhh on shop.id = hhhhh.shop_id and hhhhh.day = 5
inner join hours hhhhhh on shop.id = hhhhhh.shop_id and hhhhhh.day = 6
inner join hours hhhhhhh on shop.id = hhhhhhh.shop_id and hhhhhhh.day = 7;

表格

shop
+----+-------------------+---------+------+---------+----------------+----------+---------------+---------------+----------+-----------+
| id | name              | address | zip  | city    | municipal      | phone    | lat           | lng           | chain_id | county_id |
+----+-------------------+---------+------+---------+----------------+----------+---------------+---------------+----------+-----------+
|  1 | Test              | false   | 1234 | Test    | Test           | 12341234| 0.0000         | 0.0000        |        3 |        16 |
+----+-------------------+---------+------+---------+----------------+----------+---------------+---------------+----------+-----------+


hours
+-----+----------+----------+---------+
| day | open     | close    | shop_id |
+-----+----------+----------+---------+
|   1 | 09:00:00 | 18:00:00 |       1 |
|   2 | 09:00:00 | 18:00:00 |       1 |
|   3 | 09:00:00 | 18:00:00 |       1 |
|   4 | 09:00:00 | 18:00:00 |       1 |
|   5 | 09:00:00 | 18:00:00 |       1 |
|   6 | 09:00:00 | 20:00:00 |       1 |
|   7 | 14:00:00 | 20:00:00 |       1 |
+-----+----------+----------+---------+

1 个答案:

答案 0 :(得分:0)

您还可以使用案例..何时进行数据透视,然后按商店字段分组并使用聚合函数处理当天。

select 
    shop.NAME, shop.address, shop.zip, shop.city, shop.municipal, shop.phone, shop.lat, shop.lng,
    MAX(CASE WHEN h.DAY = 1 THEN h.DAY ELSE 0 END) AS Day1,
    MAX(CASE WHEN h.DAY = 2 THEN h.DAY ELSE 0 END) AS Day2,
    MAX(CASE WHEN h.DAY = 3 THEN h.DAY ELSE 0 END) AS Day3,
    MAX(CASE WHEN h.DAY = 4 THEN h.DAY ELSE 0 END) AS Day4,
    MAX(CASE WHEN h.DAY = 5 THEN h.DAY ELSE 0 END) AS Day5,
    MAX(CASE WHEN h.DAY = 6 THEN h.DAY ELSE 0 END) AS Day6,
    MAX(CASE WHEN h.DAY = 7 THEN h.DAY ELSE 0 END) AS Day7
from shop
    INNER JOIN HOURS h ON shop.id = h.shop_id
group by
    shop.NAME, shop.address, shop.zip, shop.city, shop.municipal, shop.phone, shop.lat, shop.lng;

只需记下您希望在日期列中显示的内容: AFAIK如果商店的任何小时行:缺少一天,您当前的查询将丢弃整行?如果您希望重复此行为,则还需要添加where子句。