【发布时间】:2020-12-27 11:24:56
【问题描述】:
我有以下表格,它本质上是一个系统,可以告诉我谁在哪个房间:
CREATE TABLE customers
(`cus_id` int PRIMARY KEY, `name` varchar(5), `driver_id` int)
;
INSERT INTO customers
(`cus_id`, `name`, `driver_id`)
VALUES
(1, 'bob', 11111),
(2, 'james', 22222),
(3, 'sam', 33333),
(4, 'billy', 44444)
;
CREATE TABLE hotel_rooms
(`hroom_id` int PRIMARY KEY, `name` varchar(10), `cus_id` int)
;
INSERT INTO hotel_rooms
(`hroom_id`, `name`, `cus_id`)
VALUES
(1, 'small room', 3),
(2, 'big room', 1)
;
CREATE TABLE snapshots
(`snapshot_id` int PRIMARY KEY, `hroom_id` int, FOREIGN KEY (hroom_id) REFERENCES hotel_rooms (hroom_id), `date_added` datetime)
;
INSERT INTO snapshots
(`snapshot_id`, `hroom_id`, `date_added`)
VALUES
(1, 1, '2020-01-12 12:43:13'),
(2, 1, '2020-01-13 17:23:53'),
(3, 2, '2020-01-19 07:34:01')
;
CREATE TABLE participants
(`participant_id` int PRIMARY KEY, `snapshot_id` int, FOREIGN KEY (snapshot_id) REFERENCES snapshots (snapshot_id), `cus_id` int)
;
INSERT INTO participants
(`participant_id`, `snapshot_id`, `cus_id`)
VALUES
(1, 1, 1),
(2, 1, 3),
(3, 2, 1),
(4, 2, 2),
(5, 2, 3),
(6, 3, 1),
(7, 3, 4)
;
我的 SQL 语句:
SELECT s.snapshot_id,
hr.name,
c1.driver_id AS owner_driver_id,
md.max_date AS date_added,
GROUP_CONCAT(c2.driver_id) AS participants_driver_ids
FROM snapshots s
JOIN (
SELECT hr.hroom_id, MAX(date_added) AS max_date
FROM hotel_rooms hr
JOIN snapshots s ON s.hroom_id = hr.hroom_id
JOIN participants p ON p.snapshot_id = s.snapshot_id
JOIN customers c ON c.cus_id = p.cus_id
WHERE c.cus_id = 1
GROUP BY hr.hroom_id, hr.name
) md ON md.hroom_id = s.hroom_id AND md.max_date = s.date_added
JOIN hotel_rooms hr ON hr.hroom_id = s.hroom_id
JOIN customers c1 ON c1.cus_id = hr.cus_id
JOIN participants p ON p.snapshot_id = s.snapshot_id
JOIN customers c2 ON c2.cus_id = p.cus_id
GROUP BY s.snapshot_id, hr.name, c1.driver_id, md.max_date
;
表和语句的SQL代码:http://www.sqlfiddle.com/#!9/6844de/1
基本上参与者表所说的是:
-
snapshot_id=1bob和sam其中在small room。 -
snapshot_id=2、bob、james和sam其中small room。 -
snapshot_id=3、bob和billy其中在big room。
但是查询速度很慢。我不明白我需要索引什么才能使这个查询更快,因为它们基本上都是连接语句。
【问题讨论】:
-
你看过执行计划了吗?它应该包含在您的帖子中。
-
您是否添加了任何约束?尝试将主键约束添加到每个表的 ID 列,后跟外键引用
-
@Govind 抱歉,我更新了我的 sql 代码以添加主键和外键。我的实际实现有这些限制
-
@KenWhite 我怎么找到它
-
了解您的查询速度很慢。但是,是否可以在此处提及您正在寻找的所需输出是什么,以便推荐一种可能更简单的替代方法而不是调试现有查询。
标签: mysql sql database indexing