Я хочу сделать что-то вроде этого:
SELECT *
FROM db.table
WHERE COUNT(someField) > 1
Как я могу добиться этого в MySql?
Ответы:
Используйте предложение HAVING
not WHERE
для сравнения совокупных результатов.
Принимая запрос за чистую монету:
SELECT *
FROM db.table
HAVING COUNT(someField) > 1
В идеале в предложении должно быть GROUP BY
указано для правильной оценки HAVING
, но MySQL действительно разрешает скрытые столбцы из GROUP BY ...
Это подготовка к уникальному ограничению someField
? Похоже, так и должно быть ...
someField
значений, или пустой набор результатов, если это не так.
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
Вы также можете сделать это с помощью самостоятельного присоединения:
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Ну вот:
SELECT Field1, COUNT(Field1)
FROM Table1
GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
В одну сторону
SELECT t1.*
FROM db.table t1
WHERE exists
(SELECT *
FROM db.table t2
where t1.pk != t2.pk
and t1.someField = t2.someField)
Как заявила OMG Ponies, условие наличия - это то, что вам нужно. Однако, если вы надеялись, что вместо сводки вы получите дискретные строки («наличие» создает сводку) - этого нельзя сделать в одном выражении. В этом случае вы должны использовать два оператора.
Я привожу пример 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
Также следует отметить, что «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 того, что это дает вам, но счет хороший, если это все, что вы хотите.
GROUP BY
(если это не какая-то нестандартная вещь MySQL)?