2015-03-02 63 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