MySQL-分组依据和不同,但返回所有行?
自学MySql的初学者。我需要返回父ID匹配的所有行,但年份不匹配。问题是,GROUPBY只为每个父id返回一行,我希望所有的都是这样,我已经使用了两个查询,并将结果从第一个粘贴到第二个,如何在一个查询中实现这一点 我有:MySQL-分组依据和不同,但返回所有行?,mysql,Mysql,自学MySql的初学者。我需要返回父ID匹配的所有行,但年份不匹配。问题是,GROUPBY只为每个父id返回一行,我希望所有的都是这样,我已经使用了两个查询,并将结果从第一个粘贴到第二个,如何在一个查询中实现这一点 我有: id parent_id year aa1 aa 2010 aa3 aa 2011 bb1 bb 2010 bb2 bb 2011 cc1 cc 2010 cc2 cc
id parent_id year
aa1 aa 2010
aa3 aa 2011
bb1 bb 2010
bb2 bb 2011
cc1 cc 2010
cc2 cc 2010
我需要返回:
id parent_id year
aa1 aa 2010
aa3 aa 2011
bb1 bb 2010
bb2 bb 2011
当前第一个查询:
SELECT id, name, `year`, parent_id
FROM t1
GROUP BY parent_id
HAVING COUNT(DISTINCT `year`) > 1
然后,我使用以下命令将结果粘贴到一个简单的select查询中:
SELECT id, parent_id, name, `year`
FROM t1
WHERE parent_id IN ('......',')
一个选项可能是使用子查询。例如:
SELECT id, name, year, parent_id
FROM t1
WHERE parent_id IN (SELECT parent_id
FROM t1
GROUP BY parent_id
HAVING COUNT(DISTINCT year) > 1)
如果要多次查询,也可以使用视图。
JOIN比SELECT中的效率更高,假设父_id已被索引
或者您可能会发现GROUP_CONCAT更有趣:
SELECT parent_id, GROUP_CONCAT(DISTINCT year) AS years
FROM t1;
GROUP BY parent_id
HAVING LENGTH(years) > 4;
请尝试以下查询:
select a.id , a.parent_id , a.year
from t1 a join t1 b
on a.id <> b.id and a.parent_id=b.parent_id and a.year<>b.year;
仅当未启用“全组”模式时
SELECT id, parent_id, `year`
FROM test
GROUP BY parent_id, `year`
HAVING COUNT(*) = 1;
仅启用“全组”模式时
SELECT ANY_VALUE(id), parent_id, `year`
FROM test
GROUP BY parent_id, `year`
HAVING COUNT(*) = 1;
返回的结果是
+---------------+-----------+------+
| ANY_VALUE(id) | parent_id | year |
+---------------+-----------+------+
| aa1 | aa | 2010 |
| aa3 | aa | 2011 |
| bb1 | bb | 2010 |
| bb2 | bb | 2011 |
+---------------+-----------+------+
即使在5.7或更高版本中,也只能禁用_FULL_GROUP_BY,因此任何_值都是有用的;但它仍然违反了标准sql行为。删除了对MySQL 5.7的引用。
+---------------+-----------+------+
| ANY_VALUE(id) | parent_id | year |
+---------------+-----------+------+
| aa1 | aa | 2010 |
| aa3 | aa | 2011 |
| bb1 | bb | 2010 |
| bb2 | bb | 2011 |
+---------------+-----------+------+