2012-09-17 20 views
0
Table kal 
id integer primary key 
init char 4 indexed 
job char4 

id init job 
--+----+------ 
1 | aa | job1 
2 | aa | job2 
3 | bb | job1 
4 | cc | job3 
5 | cc | job5 

我想告訴這裏的init有超過一排的所有行:顯示了鍵的行與多個行

id init job 
--+----+------ 
1 | aa | job1 
2 | aa | job2 
4 | cc | job3 
5 | cc | job5 

我想:

select * from kal where init in (select init from kal group by init having 
count(init)>2); 

實際上,表有60000行,查詢是

count(init)<40, 

但它需要大量的時間,phpmyadmin和我的耐心耗盡。

兩個

select init from kal group by init having count(init)>2) 

select * from kal where init in ('aa','bb','cc') 

運行在 「沒有時間」,小於0.02秒。

我已經嘗試了不同的子查詢,但都需要「無限」的時間,超過幾分鐘;我其實從來沒有讓他們完成。

回答

1

下面是一個例子,你可以在see it行動:

查詢

SELECT a.id, a.init, a.job 
FROM kal a 
INNER JOIN 
    (SELECT init, COUNT(init) 
    FROM kal 
    GROUP BY init 
    HAVING COUNT(init) > 1) b ON b.init = a.init 

結果

| ID | INIT | JOB | 
-------------------- 
| 1 | aa | job1 | 
| 2 | aa | job2 | 
| 4 | cc | job3 | 
| 5 | cc | job5 |
+0

太好了!我的查詢在50.000條記錄上從「無限」時間變爲0.0982秒。如果可以的話,我會投票。 :-)順便說一下,內部的SELECT可以只是SELECT init FROM kal。這裏重要的是,子選擇符在「)」之後有其自己的別名「b」,而不是在裏面。我希望我可以格式化... –

+0

@LeifNeland您可以修改小提琴,我可以更新代碼以反映更準確的答案。 – Kermit

2

你嘗試EXISTS

select * 
from yourtable t1 
where exists (select count(*) 
       from yourtable t2 
       where t1.init = t2.init 
       group by t2.init 
       having count(*) >= 2); 

看到SQL Fiddle with Demo

甚至這樣的:

select * 
from yourtable t1 
left join 
(
    select count(*) cnt, init 
    from yourtable 
    group by init 
) t2 
    on t1.init = t2.init 
where t2.cnt > 1 

SQL Fiddle with Demo

+0

太棒了!對不起,我現在還不能投票回答... –