这是我的查询所以请检查并告诉我。在此查询中成功执行但distinct不起作用:
SELECT
DISTINCT(ticket_message.ticket_id),
support_ticket.user_id,
support_ticket.priority,
support_ticket.subject,
support_ticket.status,
ticket_message.message
FROM
support_ticket
LEFT OUTER JOIN ticket_message ON support_ticket.ticket_id = ticket_message.ticket_id
LEFT OUTER JOIN assign_ticket ON ticket_message.ticket_id = assign_ticket.ticket_id
答案 0 :(得分:0)
使用此声明:
SELECT DISTINCT
ticket_message.ticket_id
FROM
support_ticket
LEFT OUTER JOIN ticket_message ON
support_ticket.ticket_id = ticket_message.ticket_id
LEFT OUTER JOIN assign_ticket ON
ticket_message.ticket_id = assign_ticket.ticket_id
只要您在查询中添加更多列,DISTINCT也会考虑它们。
答案 1 :(得分:0)
distinct
一词是关键字SELECT
的修饰符。因此,您需要将其视为SELECT DISTINCT
,并且它始终在整个行中运行。它只是忽略了下面的括号:
select distinct(ticket_message.ticket_id)
因为与众不同不是函数。
所以。我们似乎拥有的是带有相关消息的支持通知单。每张支持票通常有多个消息,因此我怀疑您想要的是更复杂的。例如,您可能只需要每张支持通知单的最新消息。
要获得最新,我们需要一个时间戳(或“日期时间”)列,并且我们还需要知道您的数据库是否支持“窗口功能”。假设您有一个名为message_at
的时间戳列,并且您的数据库确实支持窗口函数,那么这将减少行数:
SELECT
support_ticket.ticket_id
, support_ticket.user_id
, support_ticket.support_section
, support_ticket.priority
, support_ticket.subject
, support_ticket.status
, tm.file
, tm.message
, assign_ticket.section_id
, assign_ticket.section_admin_id
FROM support_ticket
LEFT OUTER JOIN (
SELECT
ticket_id
, file
, message
, ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY message_at DESC) AS row_num
FROM ticket_message
) tm ON support_ticket.ticket_id = tm.ticket_id
AND tm.row_num = 1
LEFT OUTER JOIN assign_ticket ON tm.ticket_id = assign_ticket.ticket_id
ROW_NUMBER() OVER (PARTITION BY ticket_id ORDER BY message_at DESC)
将数字1分配给最近消息,随后我们忽略所有> 1的行,从而消除了结果中不必要的重复。
所以
我们真的需要了解有关您的实际数据,正在使用的数据库(和版本)以及实际需求的更多信息。 几乎可以肯定,选择与众不同并不是您要实现的目标的正确方法。
我建议您阅读以下内容:Provide a Minimal Complete Verifiable Example
(MCVE)
和Why should I provide a MCVE