(MySQL 5.7) 如何合并我的两个查询?
(MySQL 5.7) How to combine my two queries?
如何在 MySQL 5.7 中合并我的两个查询:
(windows 函数不起作用)
1:此查询正在查找超过 10 条消息且间隔至少一小时的所有对话。
SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`)
2:第二个查询 select 每个对话的最后两行。
SELECT * FROM messages tbl WHERE
(SELECT COUNT(*) FROM messages tbl1 WHERE tbl1.dialog_id = tbl.dialog_id AND tbl1.id >= tbl.id AND
(user_from = :user_from OR user_to = :user_to)) <= 2 ORDER BY dialog_id DESC
所以,我想要的是 select 每个持续超过一个小时的对话的最后两行 和 发送超过 10 条消息的地方。
虽然我没有正确找到你,这是你要找的吗:
SELECT * FROM messages tbl WHERE
(SELECT COUNT(*) FROM messages tbl1 WHERE tbl1.dialog_id = tbl.dialog_id AND tbl1.id >= tbl.id AND
(user_from = :user_from OR user_to = :user_to)) <= 2
and dialog_id in (SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`))
ORDER BY dialog_id DESC
您可以使用子查询完成此操作的一种方法:
SELECT *
FROM messages tbl
WHERE (
SELECT COUNT(*)
messages tbl1
tbl1.dialog_id = tbl.dialog_id
tbl1.id >= tbl.id
(user_from = :user_from OR user_to = :user_to)) <= 2
and dialog_id in (
SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`))
ORDER BY dialog_id DESC
您可能需要稍微调整一下,因为我没有您表格的完整结构,但原则如下:获取所有 dialogue_ids 匹配您的 10 小时以上标准,然后使用它来限制从“获取最近的两条”逻辑返回的消息。
如何在 MySQL 5.7 中合并我的两个查询:
(windows 函数不起作用)
1:此查询正在查找超过 10 条消息且间隔至少一小时的所有对话。
SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`)
2:第二个查询 select 每个对话的最后两行。
SELECT * FROM messages tbl WHERE
(SELECT COUNT(*) FROM messages tbl1 WHERE tbl1.dialog_id = tbl.dialog_id AND tbl1.id >= tbl.id AND
(user_from = :user_from OR user_to = :user_to)) <= 2 ORDER BY dialog_id DESC
所以,我想要的是 select 每个持续超过一个小时的对话的最后两行 和 发送超过 10 条消息的地方。
虽然我没有正确找到你,这是你要找的吗:
SELECT * FROM messages tbl WHERE
(SELECT COUNT(*) FROM messages tbl1 WHERE tbl1.dialog_id = tbl.dialog_id AND tbl1.id >= tbl.id AND
(user_from = :user_from OR user_to = :user_to)) <= 2
and dialog_id in (SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`))
ORDER BY dialog_id DESC
您可以使用子查询完成此操作的一种方法:
SELECT *
FROM messages tbl
WHERE (
SELECT COUNT(*)
messages tbl1
tbl1.dialog_id = tbl.dialog_id
tbl1.id >= tbl.id
(user_from = :user_from OR user_to = :user_to)) <= 2
and dialog_id in (
SELECT `dialog_id`
FROM `messages`
GROUP BY `dialog_id`
HAVING COUNT(*) >= 10
AND MIN(`timestamp`) + INTERVAL 1 HOUR < MAX(`timestamp`))
ORDER BY dialog_id DESC
您可能需要稍微调整一下,因为我没有您表格的完整结构,但原则如下:获取所有 dialogue_ids 匹配您的 10 小时以上标准,然后使用它来限制从“获取最近的两条”逻辑返回的消息。