总结
我正在尝试在 SQL 中的过滤 TABLE 上进行 LEFT JOIN。
为此,我首先在 @
变量中声明一个临时表,然后尝试加入它。
不幸的是,我做这件事时运气不佳,当限制为这样的结果集时,它大大加快了我的查询速度。
其他路线尝试
我最初试图在 WHERE
上执行此操作,但是这阻止了在没有匹配的 events
的情况下发生行(我正在计算事件 by intervals_days
所以我需要返回,不管另一个是否匹配)。
在我意识到自己的错误后,我转到了ON。我还没有看到这样做的例子,我有一种感觉,在此处对 SELECT 执行 FIND_IN_SET 性能不佳?
查询
初始过滤器
DECLARE @filtered_events TABLE (id INT, eventable_id INT, eventable_type VARCHAR(255), occurred_at TIMESTAMP, finished_at TIMESTAMP)
INSERT INTO @filtered_events
SELECT
e.id, e.eventable_id, e.eventable_type, e.occurred_at, e.finished_at
FROM
units_events as ue
LEFT JOIN
events as e
ON
e.id = ue.event_id
WHERE
ue.unit_id
IN
(1,2,3);
忽略这里的(1,2,3)
,这些值是动态添加到查询中的。
我尝试使用它
SELECT
i.starts_at as starts_at,
i.ends_at as ends_at,
count(fe.id) as count
FROM
intervals_days as i
LEFT JOIN
@filtered_events as fe
ON
( fe.occurred_at >= starts_at AND fe.occurred_at < ends_at )
WHERE
( starts_at >= '15-01-2019' AND ends_at < NOW() )
GROUP BY
starts_at
ORDER BY
starts_at
DESC;
这些查询在一个 SQL 文档中,一个在另一个之上,每个查询都有终止的 ;
分号。
我希望这会输出我的较低查询输出(按 intervals_days
行分组的结果集)- 但是,我的 LEFT JOIN 查询的好处是在一个小得多的样本上进行。
最佳答案
抱歉,没有这样的语法。
MySQL 也没有数组的概念。
也不能在存储例程之外使用 DECLARE
。
关于mysql - 是否可以在 SQL 中 LEFT JOIN @variable 表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57664481/