MySQL查询返回按一个字段分组的表的所有字段,但仅当该分组在另一个字段中有多个值时

Posted

技术标签:

【中文标题】MySQL查询返回按一个字段分组的表的所有字段,但仅当该分组在另一个字段中有多个值时【英文标题】: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 field 【发布时间】:2015-09-28 20:43:36 【问题描述】:

有人可以帮帮我吗?

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

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

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

非常感谢任何帮助。

鲍勃

【问题讨论】:

【参考方案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) 获取状态列表。

【讨论】:

非常感谢你们这么快的回复解决了我的问题。

以上是关于MySQL查询返回按一个字段分组的表的所有字段,但仅当该分组在另一个字段中有多个值时的主要内容,如果未能解决你的问题,请参考以下文章

mysql 如何 多表连查 按时间到排序

mysql数据库,我想查a表所有的字段还有b表的某一个字段,请问我要怎么做关联查询

mysql怎样查询一个表中所有数据

Mysql:计数,分组,但返回所有结果

数据库查询: 列出表的所有字段,“*”符号,查询指定字段数据,DISTINCT查询,IN查询,BETWEEN AND查询,LIKE模糊查询,对查询结果排序,分组查询,统计分组查询

MongoDB返回指定字段的方法