2014-09-29 25 views
1

我希望你能幫助我解決這個問題。我一直在尋找設置MySQL查詢的方法,該查詢根據特定值發生的次數選擇行,但迄今爲止沒有運氣。我很確定我需要在某處使用count(*),但我只能找到如何計算所有值或所有不同值,而不是計算所有出現的次數。mysql選擇記錄值出現的位置

我有一個表這樣:

info setid 
-- -- 
A 1 
B 1 
C 2 
D 1 
E 2 
F 3 
G 1 
H 3 

我需要的是一個查詢,將選擇其中一個SETID發生一定次數(X)的所有行。

因此,使用X = 2應該給我

C 2 
E 2 
F 3 
H 3 

,因爲這兩個setIds 2,3各出現兩次。用x = 1或x = 3不應該給任何結果,並選擇X = 4應該給我

A 1 
B 1 
D 1 
G 1 

因爲只有SETID 1中發生的4倍。

我希望你們能幫助我。在這一點上,我一直在尋找這麼長時間的答案,我甚至不確定這個問題可以在MySQL中完成。 :)

回答

1
select * from mytable 
where setid in (
    select setid from mytable 
    group by setid 
    having count(*) = 2 
) 

您可以指定的次數#一個SETID需要在表中出現的子查詢

+0

啊,當然,但!我現在明白了:該解決方案使用「有數(*)」來確定哪些setids發生所需的次數,然後選擇具有這些setids的行!完美的作品,謝謝! :) – Thomas 2014-09-30 14:11:24

0

having count(*)部分考慮使用一個關聯子查詢以下語句:

SELECT ... FROM t1 WHERE t1.a IN(SELECT b FROM t2); 優化器將語句重寫爲相關子查詢:

SELECT ... FROM t1 WHERE EXISTS(SELECT 1 FROM t2 WHERE t2.b = t1.a); 如果內部和外部查詢分別返回M行和N行,則執行時間將變爲O(M×N)的數量級,而不像O(M + N)那樣,這與不相關的子查詢相同。

而這次在模糊樹的解決方案的子查詢是complety多餘的:

SELECT 
    set_id, 
    GROUP_CONCAT(info ORDER BY info) infos 
    COUNT(*) total 
FROM 
    tablename 
GROUP_BY set_id 
    HAVING COUNT(*) = 2