Выберите, где количество одного поля больше одного

100

Я хочу сделать что-то вроде этого:

SELECT * 
  FROM db.table 
 WHERE COUNT(someField) > 1

Как я могу добиться этого в MySql?

стивбот
источник

Ответы:

146

Используйте предложение HAVINGnot WHEREдля сравнения совокупных результатов.

Принимая запрос за чистую монету:

SELECT * 
  FROM db.table 
HAVING COUNT(someField) > 1

В идеале в предложении должно быть GROUP BYуказано для правильной оценки HAVING, но MySQL действительно разрешает скрытые столбцы из GROUP BY ...

Это подготовка к уникальному ограничению someField? Похоже, так и должно быть ...

OMG Пони
источник
11
Обязательно нужен GROUP BY(если это не какая-то нестандартная вещь MySQL)?
Мартин Смит
@ Мартин Смит: принял вопрос за чистую монету; решена проблема GROUP BY (включая функцию скрытых столбцов).
OMG Ponies,
«Похоже, так и должно быть ...» Почему? Я нуждаюсь в образовании по этому поводу :)
Дэйв,
Таким образом, это вернет всю таблицу, если она содержит более двух ненулевых someFieldзначений, или пустой набор результатов, если это не так.
Мартин Смит,
@Dave: Если бы вы были в положении, когда вам приходилось периодически проверять и исправлять неверные данные, разве вы не хотели бы в первую очередь предотвратить возникновение ситуации? MySQL реализует уникальное ограничение как индекс - для получения дополнительной информации см. Документацию CREATE INDEX
OMG Ponies
18
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
dandy_sql
источник
3
единственное предостережение здесь (по крайней мере, в MySQL Community Server 5.1.46 (GPL)) заключается в том, что «Каждая производная таблица должна иметь собственный псевдоним», что сделает ваш sql похожим на: SELECT username, numb from (Select username, count (username) as numb from customers GROUP BY username) as my_table WHERE numb> 3
D_K
14

Вы также можете сделать это с помощью самостоятельного присоединения:

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Билл Карвин
источник
12

Ну вот:

SELECT Field1, COUNT(Field1)
  FROM Table1 
 GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
Налан Мадхесваран
источник
4

В одну сторону

SELECT t1.* 
FROM db.table t1
WHERE exists 
      (SELECT *
      FROM db.table t2 
      where t1.pk != t2.pk 
      and t1.someField = t2.someField)
Мартин Смит
источник
1

Как заявила OMG Ponies, условие наличия - это то, что вам нужно. Однако, если вы надеялись, что вместо сводки вы получите дискретные строки («наличие» создает сводку) - этого нельзя сделать в одном выражении. В этом случае вы должны использовать два оператора.

Брент Ариас
источник
1
Не совсем верно - используйте GROUP BY для управления тем, что использует HAVING.
OMG Ponies,
1

Я привожу пример Group By между двумя таблицами в Sql:

Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2


пользователь4551254
источник
1

Для меня отсутствие группы просто вернуло пустой результат. Поэтому я думаю, что наличие группы для заявления о наличии очень важно

Махам Хан
источник
-2

Также следует отметить, что «pk» должно быть ключевым полем. Самостоятельное присоединение

SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk 

Билла Карвина дает вам все записи, которые являются дубликатами, что я и хотел. Поскольку у некоторых их больше двух, вы можете получить одну и ту же запись более одного раза. Я записал все в другую таблицу с теми же полями, чтобы избавиться от тех же записей путем подавления ключевых полей. Я попытался

SELECT * FROM db.table HAVING COUNT(someField) > 1

выше в первую очередь. Данные, возвращаемые из него, дают только один из дубликатов, менее 1/2 того, что это дает вам, но счет хороший, если это все, что вы хотите.

Джим Бланшар
источник
3
Это не совсем ответ.
anon582847382 01