繁体   English   中英

MySQL查询以获取多个表上一列的第一个唯一值

[英]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你有两个选项,两者都应该比你的查询表现更好,第二个更快(请在你的数据库中发布实际的持续时间!):

1.标准兼容查询,但速度较慢:

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表两次,这可能使大表的速度慢一点。

2.更快,但使用MySQL扩展到标准SQL:

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM