2017-01-01 57 views
0

當我執行MySQL查詢獲得基於值的所有副本從兩列

select *, count(*) c 
FROM mytable 
GROUP BY col3, col4 
HAVING c > 1 
order by col4, col3; 

我期待得到其中的任何值,選擇之中,有行至少兩個當量(COL3,COL4) 。 但是,我得到的結果只有一行發生一些col3值。有人可以解釋爲什麼嗎?

換句話說,我試圖建立一個查詢,獲取所有行對齊(col3,col4)不止一次。

意想不到的結果的例子是這樣的:

id - col1 - col2 - col3 - col4 - c  
123- val1 val123 43 val444 2 
456- val14 val52 45 val444 2 

43列COL3從未發生的結果,但我期望的那樣。否則這行不應該在結果中。

正確,

select * from ukberu1m where col3=43 and col4=val444; 

給出了兩個結果在原來的表,但在結果表中只有一行由如意的標準,而不是兩個由於某種原因顯示。

+1

該查詢應該做你想要的。你可以發佈一些取得錯誤結果的樣本數據嗎? – Barmar

+0

您可能選擇比group by子句中列出的更多非聚合列;爲獲取所有列,請使用子查詢 –

回答

2

如果您想要查看所有具有重複項的行,而不是每個行的一個實例,則需要將您的查詢與原始表連接。

SELECT t1.* 
FROM mytable AS t1 
JOIN (SELECT col3, col4 
     FROM mytable 
     GROUP BY col3, col4 
     HAVING COUNT(*) > 1) AS t2 
ON t1.col3 = t2.col3 AND t1.col4 = t2.col4 
ORDER BY col4, col3 
+0

謝謝。它花了一段時間來測試它。有用。如果你解釋爲什麼問題中的查詢做了不同的事情,我將不勝感激。它分組 - 是的。它爲什麼只顯示第一行?非常感謝。 – Haradzieniec

+1

因爲這就是'GROUP BY'所做的:它將具有相同值的所有行組合成一行。 – Barmar

+1

當您想要獲得特定列的總計時,您可以使用「GROUP BY」。就像如果你想按日期計算行一樣,你可以使用'SELECT DATE(timestamp)作爲日期,COUNT(*)... GROUP BY日期'。 – Barmar

1

假設id是每行唯一的,一種替代方法是:

select t.* 
from mytable t 
where exists (select 1 
       from mytable t2 
       where t2.col3 = t.col3 and t2.col4 = t.col4 and t2.id <> t.id 
      ); 

這種方法的優點是,它可以在mytable(col3, col4)採取的索引的非常好的優點。