【问题标题】:MySQL Select - Combine COUNT with GROUP_CONCATMySQL 选择 - 将 COUNT 与 GROUP_CONCAT 组合
【发布时间】:2009-07-31 06:03:24
【问题描述】:

我目前有一个 MySQL SELECT 语句,它从两个表中提取信息以显示用于私人消息传递的“已发送消息”字段。

我想知道如何在我的查询中添加一个 COUNT 来计算一个线程中“接收者”的数量。

这是我的表结构的基本要点,(注意:两个表之间的关系是 pm-info 中的“message-id”和 pm_data 中的“id”):

pm_info:
   id     message_id    receiver_id    is_read     read_date

pm_data:
   id    date_sent    title    sender_id    thread_id    content

这是我的 SELECT 语句:

SELECT pm_info.is_read, group_concat(DISTINCT receiver.usrFirst) as receiver_name,
pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as data_id,
MAX(date_sent) AS thread_max_date_sent
FROM pm_info
INNER JOIN pm_data ON pm_info.message_id = pm_data.id
INNER JOIN tblUsers AS receiver ON pm_info.receiver_id = receiver.usrID
WHERE pm_data.sender_id = '$usrID'
GROUP BY pm_data.thread_id
ORDER BY thread_max_date_sent DESC

它会像这样输出收件人:

Message 1 - Recipients: John, David, Steve - thread_id = 1234
Message 2 - Recipients: Bill, David, John, Ed, Steve - thread_id = 1345

基本上,我想做的是可以选择对收件人进行计数,因此在上面的示例中,“邮件 1”将显示三 (3) 个收件人,而“邮件 2”将显示五 (5) 个收件人收件人。

这样,如果我有一个线程/消息发送给 30 个用户,则不会打印出所有 30 个名称。

谢谢!

【问题讨论】:

  • 注意 group_concat 由于其返回值的长度而受到的限制。

标签: php mysql select


【解决方案1】:

您是否尝试过将 GROUP_CONCAT 替换为 COUNT?像这样:

COUNT(DISTINCT receiver.usrFirst) as receiver_count

或者更好的是,使用 pm_info.receiver_id (这可能让您消除其中一个联接):

COUNT(DISTINCT pm_info.receiver_id) as receiver_count

【讨论】:

    【解决方案2】:

    您可以使用子查询为每封邮件选择最多 3 个收件人,然后使用另一个子查询来连接他们的姓名:

    select 
        (   select group_concat(usrFirst separator ', ') 
            from tblUsers
            where usrId in (
                select usrId
                from tblUsers
                where usrId = pm_info.receiver_id
                limit 3
            )
        ) as receiver_name
     from pm_info
     ....
    

    【讨论】:

      【解决方案3】:

      您可以将 count 和 group_concat 移动到 concat 语句中。

      ... group_concat(DISTINCT receiver.usrFirst) as receiver_name ...
      

      变成

      ... concat('messages:', count(distinct receiver.usrFirst),'(',group_concat(DISTINCT receiver.usrFirst),')') as receiver_name ...
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 2021-01-30
        • 2011-10-29
        • 2017-04-19
        • 2016-08-29
        相关资源
        最近更新 更多