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秒未満の「時間なし」で実行されます。

さまざまなサブクエリを試しましたが、すべて「無限」の時間、数分以上かかります。私は実際にそれらを終わらせたことがありません。

4

2 に答える 2

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 FiddlewithDemoを参照してください

またはこれさえ:

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 FiddlewithDemoを参照してください

于 2012-09-17T21:31:02.963 に答える
1

これが例です、そしてあなたはそれが実際に動いているのを見ることができます:

クエリ

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 |
于 2012-09-17T21:28:34.147 に答える