Mysql怎样求对同一个表的多个查询的交集

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql怎样求对同一个表的多个查询的交集相关的知识,希望对你有一定的参考价值。

参考技术A 查询1:
select * form A where keywords like '%小猫%'
查询2:
select * form A where keywords like '%小狗%'
select * from 查询1 a inenr join 查询2 on a.keywords=b.keywords

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

【中文标题】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 索引合并(Index Merge)优化

使用联结表的查询交集

参数筛选查询——多表求交集(INTERSECT)+WITH AS

mysql索引(九)索引合并

SQL(Redshift)获取多个表的交集

mysql中有2个结构一样的表,我想把两个表的交集存到另一个表中,请问怎么操作呢?