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

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

最佳答案

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

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 子句。

关于用于将多行合并为一个的 MySQL 动态内部联接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21276986/

相关文章:

mysql - 在 NetBeans 中创建 3D 条形图以显示数据库中的前 10 个项目

mysql - 将查询 SQL 转换为 PostgreSQL

mysql - Ruby on Rails 和远程 MySQL

mysql游标更新位置索引与循环计数

mysql - 如何在插入值到另一个表的属性的基础上增加一个表的属性值?

mysql - SQL子查询错误1054未知列

sql - 如何检查输入的日期是 mm/dd/yyyy 而不是 dd/mm/yyyy?

mysql - 我可以使用从 SELECT 子句中的子查询返回的列对结果进行排序吗?

mysql - 选择与其他记录无关的记录

sql - 如何在 VBScript 中使用带有 adArray 数据类型的 ADODB 参数化查询?