【问题标题】:mysql group by select with conditional valuemysql group by select 带条件值
【发布时间】:2013-07-20 15:34:18
【问题描述】:

在我的消息表中,例如,我有以下行,

|----|---------|--------------|------|
| id | user_id | message      |status|
|====|=========|==============|======|
| 1  |  2      | msgs 11      |  r   |
|----|---------|--------------|------|
| 2  |  3      | msgs 12      |  r   |
|----|---------|--------------|------|
| 3  |  2      | msgs 13      |  r   |
|----|---------|--------------|------|
| 4  |  3      | msgs 14      |  u   |
|----|---------|--------------|------|

现在,我需要知道每个user_id 的两件事

  • 是否有状态u
  • 有多少条消息

例如,如下查询 select user_id, status, count(*) as totalMsg from messages group by user_id 会给我带来以下几行

| user_id | status| totalMsg |
|=========|=======|==========|
|  2      |   r   |    2     |
|---------|-------|----------|
|  3      |   r   |    2     | 
              ^
              |------> I need this value to be 'u' because user 3 has a message u

我当前的查询并不能真正保证它将在状态列中查找u。 那有可能吗?如果有怎么办?

【问题讨论】:

    标签: php mysql sql group-by


    【解决方案1】:

    MAX() 可以解决这个问题,因为r 是基于字典顺序的最小值。

    SELECT  user_ID,
            MAX(status) status,
            COUNT(*) totalMsg
    FROM    messages
    GROUP   BY user_ID
    

    【讨论】:

    • 后续问题:还有其他的状态值吗?如果是这样,如果ur 没有状态,输出会是什么?
    • 嗯,实际值是readunread。看起来不错的把戏。需要检查
    • 还有一个好处...我只是想为这个问题获得一个更好的标题,以便有同样问题的人可以轻松找到它。所以任何人都请随时用更好的标题编辑标题。
    • 只是出于好奇,如果可能的值可以超过两个怎么办?那时至少 MIN/MAX 不会有帮助。
    • 回到我的第一条评论,如果ur 没有状态,输出会是什么?您需要使用CASEIF 语句。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2017-11-07
    相关资源
    最近更新 更多