[英]MySQL query to get first unique values of one column on multiple tables
我有以下SQL查询来查询我的票证,ticketThreads,用户和threadStatus表:
SELECT tickets.threadId, ticketThreads.threadSubject, tickets.ticketCreatedDate, ticketThreads.threadCreatedDate, threadStatus.threadStatus, users.name
FROM
tickets
INNER JOIN
ticketThreads
ON
tickets.threadId = ticketThreads.threadId
INNER JOIN
threadStatus
ON
ticketThreads.threadStatus = threadStatus.id
INNER JOIN
users
ON
users.id = ticketThreads.threadUserId
WHERE
tickets.ticketId = ticketThreads.lastMessage
AND
ticketThreads.threadStatus != 3
ORDER BY
tickets.ticketCreatedDate
DESC
它返回的删节版本是:
threadId |
----------
1 |
2 |
这工作正常,是我所期望的,但是稍微清理代码和数据库我需要删除ticketThreads.lastMessage列。
如果我删除行WHERE tickets.ticketId = ticketThreads.lastMessage
那么这是返回的删节版本:
threadId |
----------
1 |
2 |
1 |
我需要做的是编辑上面的查询以使我能够为故障单数据库中的每个threadId值选择最高的唯一值。
我知道MAX()
和GROUP BY
但无法知道如何将它们放入我的查询中。
表格的相关部分如下所示:
门票
ticketId | ticketUserId | threadId
-------------------------------
1 | 1 | 1
2 | 1 | 2
3 | 1 | 1
ticketThreads
threadId | lastMessage | threadStatus
-------------------------------
1 | 3 | 4
2 | 2 | 1
我希望以上所有内容都是明确的,也是有道理的
那么你需要每个线程具有最高id的ticket
? 你的问题实际上非常容易变化每组最大记录问题 。 不需要任何子查询。 Basicaly你有两个选项,两者都应该比你的查询表现更好,第二个更快(请在你的数据库中发布实际的持续时间!):
SELECT t1.threadId, ticketThreads.threadSubject, t1.ticketCreatedDate,
ticketThreads.threadCreatedDate, threadStatus.threadStatus, users.name
FROM tickets as t1
LEFT JOIN tickets as t2
ON t1.threadId = t2.threadId AND t1.ticketId < t2.ticketId
JOIN ticketThreads ON t1.threadId = ticketThreads.threadId
JOIN threadStatus ON ticketThreads.threadStatus = threadStatus.id
JOIN users ON users.id = ticketThreads.threadUserId
WHERE t2.threadId is NULL
AND ticketThreads.threadStatus != 3
ORDER BY t1.ticketCreatedDate DESC
这一次加入tickets
表两次,这可能使大表的速度慢一点。
set @prev_thread := NULL;
SELECT t.threadId, ticketThreads.threadSubject, t.ticketCreatedDate,
ticketThreads.threadCreatedDate, threadStatus.threadStatus, users.name
FROM tickets as t
JOIN ticketThreads ON t.threadId = ticketThreads.threadId
JOIN threadStatus ON ticketThreads.threadStatus = threadStatus.id
JOIN users ON users.id = ticketThreads.threadUserId
WHERE ticketThreads.threadStatus != 3
AND IF(IFNULL(@prev_thread, -1) = @prev_thread := t.threadId, 0, 1)
ORDER BY t.threadId, t.ticketId DESC,
t.ticketCreatedDate DESC
在这里,我们对有序连接数据执行一次扫描,使用辅助mysql变量@prev_thread
仅过滤每个线程(具有最高ticketId的那个)的第一个(在给定顺序中)票证。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.