mysql 使用 GROUP_CONCAT 查询 1 行结果?

问题描述 投票:0回答:1

我不是一个经验丰富的程序员,所以请慢慢来!而且我不确定我想要的是否可能。我可能需要提供更多信息。

我们在 Joomla 网站上内置了一个简单的票务系统,并且正在更改为另一个平台。我需要从现有站点将数据提取到电子表格中(以供历史记录/参考)。 mysql 数据库有 6 个表的票证数据。

我可以输出所有这些数据,但当查询迭代数据时,我的电子表格中最终会出现多行。 2 个字段给我带来了麻烦 - 消息和自定义字段 - 每个字段都位于自己的表中,并带有它们所属票证的索引。消息就像工单中的对话,因此可能有 1 条或很多条。自定义字段因工单类型而异 - 每个字段都有一个标签和数据字段 - 因此,如果有 2 条消息和 3 个自定义字段,我最终会得到 6 行,如果有 1 和 3 行,我最终会得到 3 行,等等。来自 311现有门票 我有一个包含 3270 个结果的电子表格 - 无法使用!我想最终获得第一行中每张票的所有数据。

我昨天发现了GROUP_CONCAT函数。这已将输出减少到 24 行 - 与 3270 不同,但不正确并且仍然无法使用!发生的情况是,来自许多票证的消息被连接到输出中的单个单元格中,我只希望连接每个票证中的票证。我还想连接票证的自定义字段,但尚未查看该部分。

这是我的sql...

SELECT ROW_NUMBER() OVER (
    ORDER BY sgj4z_rsticketspro_tickets.id
    ) 'Row number',
    sgj4z_rsticketspro_tickets.id AS 'ID',
    DATE_FORMAT (sgj4z_rsticketspro_tickets.date,"%d/%m/%Y") AS 'Date raised',
    sgj4z_users.name AS 'Raised by',
    sgj4z_rsticketspro_tickets.code AS 'Code',
    sgj4z_rsticketspro_tickets.subject AS 'Subject',
    sgj4z_rsticketspro_statuses.name AS 'Status',
    sgj4z_rsticketspro_priorities.name AS 'Priority',
    GROUP_CONCAT(sgj4z_rsticketspro_ticket_messages.message SEPARATOR '  |  ') AS 'Messages',
    sgj4z_rsticketspro_custom_fields.label AS 'Custom field name',
    sgj4z_rsticketspro_custom_fields_values.value AS 'Value',
    DATE_FORMAT (sgj4z_rsticketspro_tickets.closed,"%d/%m/%Y") AS 'Date closed'
FROM
    (
    sgj4z_rsticketspro_tickets
    INNER JOIN sgj4z_users ON sgj4z_rsticketspro_tickets.customer_id = sgj4z_users.id
    INNER JOIN sgj4z_rsticketspro_statuses ON sgj4z_rsticketspro_tickets.status_id = sgj4z_rsticketspro_statuses.id
    INNER JOIN sgj4z_rsticketspro_priorities ON sgj4z_rsticketspro_tickets.priority_id = sgj4z_rsticketspro_priorities.id
    INNER JOIN sgj4z_rsticketspro_custom_fields_values ON sgj4z_rsticketspro_tickets.id = sgj4z_rsticketspro_custom_fields_values.ticket_id
    INNER JOIN sgj4z_rsticketspro_ticket_messages ON sgj4z_rsticketspro_tickets.id = sgj4z_rsticketspro_ticket_messages.ticket_id
    INNER JOIN sgj4z_rsticketspro_custom_fields ON sgj4z_rsticketspro_custom_fields_values.custom_field_id = sgj4z_rsticketspro_custom_fields.id
    )
WHERE NOT 
    (
    sgj4z_rsticketspro_ticket_messages.user_id = "-1"
    )
GROUP BY sgj4z_rsticketspro_custom_fields.label;

我可以让 GROUP_CONCAT 将每张票证的消息与其他票证分开连接 - 如何?

谢谢尼格

mysql group-concat
1个回答
0
投票

而不是

INNER JOIN sgj4z_rsticketspro_ticket_messages ON sgj4z_rsticketspro_tickets.id =
        sgj4z_rsticketspro_ticket_messages.ticket_id`

你可以使用

INNER JOIN (
    select 
        ticket_id
        , group_concat(message  SEPARATOR ' | ') as message
    from sgj4z_rsticketspro_ticket_messages
    group by ticket_id
) as ticketwise_messages ON 
sgj4z_rsticketspro_tickets.id =
        ticketwise_messages.ticket_id

并更换

GROUP_CONCAT(sgj4z_rsticketspro_ticket_messages.message SEPARATOR ' | ') AS 'Messages',

ticketwise_messages.message as 'Messages'

希望这有帮助。对自定义字段表也执行相同的操作。

© www.soinside.com 2019 - 2024. All rights reserved.