1

这是我的查询,所以请检查并告诉我。在此查询中成功执行但 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
4

2 回答 2

1

worddistinct是关键字的修饰符SELECT。所以你需要把它想象成SELECT DISTINCT它总是在整个行中运行。它只是忽略了下面的括号:

select distinct(ticket_message.ticket_id)

因为 distinct 不是函数。

所以。我们似乎拥有的是带有相关消息的支持票。每个支持票通常有多条消息,所以我怀疑你想要的更复杂。例如,您可能只需要每个支持票证的最新消息。

要获得最新信息,我们需要一个时间戳(或“日期时间”)列,并且我们还需要知道您的数据库是否支持“窗口函数”。假设您有一个时间戳列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 的行,从而消除结果中不需要的重复。

所以。

我们确实需要更多地了解您的实际数据、您正在使用的数据库(和版本)以及您的实际需求。几乎可以肯定 select distinct 不是您想要实现的正确技术。

我建议您阅读以下内容:提供Minimal Complete Verifiable Example(MCVE)我为什么要提供 MCVE

于 2019-01-04T10:59:15.130 回答
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 也会将它们考虑在内。

于 2012-07-28T08:55:29.480 回答