Вот мой стол
CREATE TABLE log_table (
`user_id` VARCHAR(5),
`date_time` DATETIME,
`event_name` VARCHAR(10),
`trivial` int
);
INSERT INTO log_table
(`user_id`, `date_time`, `event_name`, `trivial`)
VALUES
('001', '2020-12-10 10:00:02', 'c', 3),
('001', '2020-12-10 10:00:01', 'b', 9),
('001', '2020-12-10 10:00:40', 'e', 2),
('001', '2020-12-10 10:00:20', 'd', 6),
('001', '2020-12-10 10:00:00', 'a', 1),
('002', '2020-12-09 10:00:10', 'C', 9),
('002', '2020-12-10 10:00:50', 'D', 0),
('002', '2020-12-10 10:00:02', 'A', 2),
('002', '2020-12-10 10:00:09', 'B', 4);
(создано на DB Fiddle)
Я хочу найти одного человека (любого), который вызвал имя события, и получить все записи этого пользователя в этот день.
user_id | date_time | event_name | trivial | trivial_new |
---|---|---|---|---|
001 | 2020-12-10 10:00:00 | a | 1 | 13 |
001 | 2020-12-10 10:00:01 | b | 9 | 19 |
001 | 2020-12-10 10:00:02 | c | 3 | 21 |
001 | 2020-12-10 10:00:20 | d | 6 | 20 |
001 | 2020-12-10 10:00:40 | e | 2 | 11 |
002 | 2020-12-09 10:00:02 | A | 2 | 15 |
002 | 2020-12-10 10:00:09 | B | 4 | 15 |
002 | 2020-12-10 10:00:10 | C | 9 | 15 |
002 | 2020-12-10 10:00:50 | D | 0 | 13 |
Вот мой код:
SELECT t_left.*
FROM log_table AS t_left
RIGHT JOIN (SELECT user_id,
date_time
FROM log_table
WHERE BINARY event_name = 'B'
LIMIT 1) AS t_right
ON t_left.user_id = t_right.user_id
AND Substring_index(t_left.date_time, ' ', 1) =
Substring_index(t_right.date_time, ' ', 1)
ORDER BY date_time
В правой таблице была бы только одна запись, которая удовлетворяет условиям, что event_name
это B
, то есть пользователь с id 002. И затем я присоединяю ее к левой таблице при условии, что их user_id равны, а дата равна 2020-12-10
, удаление других пользователей с другими id, 001
и записи того же человека, события которого произошли не 2020-12-10
.
Все работает хорошо.
Затем я изменил свой код, чтобы проверить, будет ли он работать так, как я ожидал (так и произошло, см. здесь):
SELECT t_left.*
FROM log_table AS t_left
RIGHT JOIN (SELECT user_id,
date_time
FROM log_table
WHERE BINARY event_name = 'B'
LIMIT 1) AS t_right
ON t_left.user_id = t_right.user_id
WHERE Substring_index(t_left.date_time, ' ', 1) =
Substring_index(t_right.date_time, ' ', 1)
ORDER BY date_time
В этом случае я просто соединяю таблицы по одному условию и фильтрую даты этого пользователя, чтобы получить правильные записи.
Я прочитал несколько ответов здесь и здесь и здесь, где большинство примеров зависят от константы, и некоторые люди говорят, что соединение будет быстрее, а другие утверждают, что компилятор оптимизирует предложения и, следовательно, скорость будет такой же.
Интересно, в моем случае первый будет быстрее?
Любая онлайн-платформа для сравнения скорости?
DATE(t_left.date_time)
вместоSUBSTRING_INDEX(t_left.date_time, ' ', 1)
для извлечения даты. - person FaNo_FN   schedule 30.01.2021LEFT JOIN
вместоRIGHT JOIN
.) - person Rick James   schedule 30.01.2021AND Substring_index(t_left.date_time, ' ', 1) = Substring_index(t_right.date_time, ' ', 1)
- person Strawberry   schedule 30.01.2021