Виберіть, де кількість одного поля більша за одиницю


100

Я хочу зробити щось подібне:

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

Як я можу досягти цього в MySql?

Відповіді:


146

Використовуйте HAVING, а не WHEREпункт, для сукупного порівняння результатів.

Отримання запиту за номіналом:

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

В ідеалі, GROUP BYу HAVINGпункті повинно бути визначено правильну оцінку , але MySQL дозволяє допускати приховані стовпці від GROUP BY ...

Це готується до унікального обмеження someField? Схоже, це має бути ...


11
Потрібно, GROUP BYбезумовно, (якщо це не стандартне для MySQL)?
Мартін Сміт

@Martin Smith: взяв запит за номіналом; вирішено проблемою GROUP BY (включаючи функцію прихованих стовпців).
OMG Ponies

"Схоже, це має бути ..." Чому? Мені потрібна освіта з цього питання :)
Дейв,

Таким чином, це поверне всю таблицю, якщо вона містить більше 2 ненульових 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

3
Єдиний застереження тут (принаймні в 5.1.46-сервісі MySQL-сервера спільноти MySQL (GPL)) полягає в тому, що "Кожна похідна таблиця повинна мати власний псевдонім", завдяки якій ви будете виглядати sql таким чином: SELECT ім'я користувача, 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


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, щоб маніпулювати тим, що використовує ВЛАСНИЙ.
OMG Ponies

1

Я наводжу приклад для групи 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



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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.