2013-11-18 1 views
0

Я хочу вернуть все строки, которые имеют определенное значение в столбце и имеют более 5 экземпляров, в которых число является определенным значением. Например, я хотел бы вернуть все строки условия, в котором, если значение в столбце M имеет число 1 в нем, и есть 5 или более экземпляров M, имеющих число 1 в нем, тогда он будет возвращать все строки с этим условием.Возвращает запрос, когда количество запросов больше числа?

select * 
from tab 
where M = 1 
group by id --ID is the primary key of the table 
having count(M) > 5; 

EDIT: Вот моя таблица:

id | M  | price 
--------+-------------+------- 

    1 |    | 100 
    2 |   1 | 50 
    3 |   1 | 30 
    4 |   2 | 20 
    5 |   2 | 10 
    6 |   3 | 20 
    7 |   1 |  1 
    8 |   1 |  1 
    9 |   1 |  1 
10 |   1 |  1 
11 |   1 |  1 

Первоначально я просто хочу, чтобы вставить в триггер, так что, если число М = 1 является больше 5, то я хочу, чтобы создать исключение. Запрос, который я попросил, будет вставлен в триггер. END EDIT.

Но мой стол всегда пуст. Может кто-нибудь мне помочь? Благодаря!

+1

IIRC 'GROUP BY' the PK всегда имеет COUNT = 1 – Alex

+0

схема с заполненной таблицей + желаемый о/р поможет –

ответ

0

Попробуйте это:

select * 
from tab 
where M in (select M from tab where M = 1 group by M having count(id) > 5); 

SQL Fiddle Demo

0

please try

select *,count(M) from table where M=1 group by id having count(M)>5 
+0

Хм, но я не хочу возвращать счет ... есть способ не выбирать рассчитывать (M)? – user1871869

+0

попробуйте еще раз обновить по мере необходимости –

+0

Хм, я не вижу, как это ничем не отличается от последнего. – user1871869

0

С вами группы на вашем ПК (который, кажется бесполезным пребывание), вы рассчитываете на ID, whicg будет действительно всегда возвращается 1.

Как я объясняю, корма этот код, этот запрос НЕ хорош, это НЕ ответ, и я также объясняю ПОЧЕМУ. Не ожидайте, что этот запрос будет работать правильно!

select * 
from tab 
where M = 1 
group by M 
having count(*) > 5; 

Нравится программа? Поделись с друзьями! В то же время это приведет к неожиданному поведению, поскольку вы выбираете все типы столбцов, которые не входят в группу, или в любом агрегате. Я знаю, что mySQL снисходителен к этому, но я даже не хочу знать, что он будет производить.

Попробуйте действительно подзапрос вдоль этих линий:

select * 
from tab 
where M in 
(SELECT M 
from tab 
group by M 
having count(*) > 5) 
+0

Ваш первый запрос дает ошибку. Так что удалите его. См .: http://sqlfiddle.com/#!3/f05e0/2 –

+0

Конечно, я тоже это упоминаю. Таким образом, запрос OP, поскольку он также выбирает столбцы, которые не являются ни в группе, ни в совокупности. Вот почему я показал, что это неправильно. Я действительно объяснил, что это было неправильно, и почему. Я не вижу, как объяснить очень распространенную ошибку SQL так плохо? – oerkelens

+0

Теперь вы отредактировали свой ответ и добавили объяснение, которое не было раньше. –

0

Я построил SQLFiddle demo (я использовал «Test» в качестве имени таблицы по привычке) Выполнение этого (я не имею MySql под рукой теперь, чтобы проверить его).

-- Made up a structure for testing 
CREATE TABLE Test (
    id INT NOT NULL AUTO_INCREMENT, 
     PRIMARY KEY(id), 
    M int 
); 

SELECT id, M FROM tab 
WHERE M IN (
    SELECT M 
    FROM Test 
    WHERE M = 1 
    GROUP BY M 
    HAVING COUNT(M) > 5 
) 

Суб-запрос является общим «найти дубликаты» вид запроса, с дополнительным условием определенного значения для столбца M, а также о том, что должно быть по крайней мере 5 простофилями.

Он выплюнет ряд значений M, которые вы можете использовать для запроса таблицы против, заканчивая строками, которые вам нужны.

Вы не должны использовать SELECT *, это плохая практика в целом: не извлекайте данные, которые вы на самом деле не используете, и если вы используете их, тогда потребуется немного времени, необходимого для ввода списка полей, вы, скорее всего, увидите более быстрый запрос, а с другой стороны, код будет более читабельным.