2014-09-29 3 views
1

Надеюсь, вы сможете помочь мне с этим. Я искал способы настроить запрос MySQL, который выбирает строки на основе количества раз, когда возникает определенное значение, но пока не повезло. Я почти уверен, что мне нужно использовать count (*) где-то, но я могу только найти, как считать все значения или все различные значения, а не считать все вхождения.mysql выбирает записи, где происходит значение

У меня есть таблица, как, например:

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

Что мне нужно, это запрос, который будет выбирать все строки, где SETID происходит определенное число (х) раз.

Таким образом, используя х = 2 должен дать мне

C 2 
E 2 
F 3 
H 3 

, потому что оба setIds 2 и 3 каждый происходят два раза. Использование х = 1 или х = 3 не должны давать никаких результатов, и выбирая х = 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 должен произойти в таблице в having count(*) частях подзапроса

+0

Ах, но конечно же! Теперь я понимаю: это решение использует «с count (*)», чтобы определить, какие setids происходят за требуемое количество раз, а затем выбирает строки, которые имеют эти setids! Отлично работает, спасибо! :) – Thomas

0

Рассмотрит следующее утверждение, которое использует некоррелированный подзапрос:

SELECT ... FROM t1 WHERE t1.a IN (SELECT b FROM t2); Оптимизатор перезаписывает оператор в коррелированный подзапрос:

SELECT ... FROM t1 WHERE EXISTS (ВЫБРАТЬ 1 ОТ t2 ГДЕ t2.b = t1.a); Если внутренний и внешний запросы возвращают строки M и N соответственно, время выполнения становится порядка O (M × N), а не O (M + N), как это было бы для некоррелированного подзапроса.

Но на этот раз подзапрос в растворе Fuzzy Tree является complety излишни:

SELECT 
    set_id, 
    GROUP_CONCAT(info ORDER BY info) infos 
    COUNT(*) total 
FROM 
    tablename 
GROUP_BY set_id 
    HAVING COUNT(*) = 2 
Смежные вопросы