2015-03-02 64 views
0

自学MySql初学者..我需要带回parent_ids匹配的所有行,但一年不会。问题是,GROUP BY只为每个parent_id返回一行,并且我想要所有的(所以,我一直在使用2个查询,并将结果从第一个粘贴到第二个)如何在一个查询中执行此操作?MySQL - GROUP By和DISTINCT,但返回所有行?

我:

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 id, parent_id, name, `year` 
FROM t1 
WHERE parent_id IN ('......',') 

回答

0

一个选项可能是使用子查询。例如:

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) 

如果将要查询多次,您也可以使用视图。 http://www.w3schools.com/sql/sql_view.asp

0
SELECT id, parent_id, year 
    FROM t1 
    JOIN 
     (SELECT parent_id 
      FROM t1 
      GROUP BY parent_id 
      HAVING COUNT(DISTINCT year) > 1) AS b USING(parent_id 
    ); 

(JOIN比IN (SELECT ...)更有效,假设parent_id索引。)

或者,你可能会发现GROUP_CONCAT更有趣:

SELECT parent_id, GROUP_CONCAT(DISTINCT year) AS years 
    FROM t1; 
    GROUP BY parent_id 
    HAVING LENGTH(years) > 4; 
0

尝试此查询:

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; 
1

当当ONLY_FULL_GROUP_BY模式被启用

SELECT ANY_VALUE(id), parent_id, `year` 
FROM test 
GROUP BY parent_id, `year` 
HAVING COUNT(*) = 1; 

返回的结果是未启用ONLY_FULL_GROUP_BY模式

SELECT 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 | 
+---------------+-----------+------+ 
+0

ONLY_FULL_GROUP_BY甚至可以在5.7或以上被禁止,因此any_value()是有用;但它仍然违反了标准的sql行为 – 2016-09-14 10:37:17

+0

正确。删除了对MySQL 5.7的引用。 – 2016-09-14 11:03:04