【问题标题】:MySQL query to return all fields of a table grouped by one field but only where that grouping has more than one value in another fieldMySQL查询返回按一个字段分组的表的所有字段,但仅当该分组在另一个字段中有多个值时
【发布时间】:2015-09-28 20:43:36
【问题描述】:

有人可以帮帮我吗?

我的表格中有 5 个字段 (person_id、日期时间、用户名、地址和类别)

我希望能够实现的是检索按用户分组并按用户名和日期时间排序的所有用户的所有字段,但只检索类别值在查询期间发生变化的用户的记录。

我可以单独检索已更改状态的用户列表。 我可以通过其他条件检索所有用户的所有详细信息。 我可以对上述任何一个结果进行分组和排序,但至于能够将它们结合在一起以实现我的目标,这让我发疯了。我想我有它,尝试它,什么都没有。我什至考虑检索结果,包括存储用户拥有的不同类别数量的额外字段,并使用 PHP 仅将大于 1 的内容回显到屏幕,但失败了。

非常感谢任何帮助。

鲍勃

【问题讨论】:

    标签: mysql


    【解决方案1】:

    如果我理解正确,您首先要识别与给定datetime 范围内多个category 关联的username 值:

    SELECT   username
    FROM     myTable
    WHERE    datetime BETWEEN :start AND :end
    GROUP BY username
    HAVING   COUNT(DISTINCT category) > 1
    

    然后您想检索这些用户名在给定datetime 范围内的所有记录,按usernamedatetime 排序:

    SELECT   *
    FROM     myTable NATURAL JOIN (
               SELECT   username
               FROM     myTable
               WHERE    datetime BETWEEN :start AND :end
               GROUP BY username
               HAVING   COUNT(DISTINCT category) > 1
             ) t
    WHERE    datetime BETWEEN :start AND :end
    ORDER BY username, datetime
    

    【讨论】:

    • 非常感谢你们这么快的回复解决了我的问题。
    【解决方案2】:

    如果我理解正确,您只是想找到在一段时间内拥有多个身份的人。所以,是这样的:

    select person_id
    from table t
    where datetime >= $date1 and datetime <= $date2
    group by person_id
    having min(status) <> max(status);
    

    您可以使用group_concat(distinct status)group_concat(status order by datetime) 获取状态列表。

    【讨论】:

    • 非常感谢你们这么快的回复解决了我的问题。
    猜你喜欢
    • 2014-06-23
    • 2020-03-06
    • 2016-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-08-22
    • 1970-01-01
    • 2018-11-28
    相关资源
    最近更新 更多