2014-01-22 33 views
3

我正在用下面的表创建一个数据库,其中小时的shop_id指的是店铺中的一个id。
最好我会有一个查询返回一行中的所有数据,而不需要后处理大量的行来“合并”小时的结果,因此最终结果如下所示。MySQL动态内部连接将多行组合成一个?

+-------------------+---------+------+---------+----------------+----------+---------------+---------------+-----+-----+-----+-----+-----+-----+-----+ 
| 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 | 
+-----+----------+----------+---------+ 

回答

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; 

只是你想要什么在当天列中显示注:当天丢失,当前的查询将丢弃整行:如果任何时间行的店 据我所知?如果你想重复这种行为,你还需要添加一个where子句。

+1

谢谢!这似乎很完美! – JoMs