Самая простая вещь - статические переменные или статические методы находятся на уровне класса. Переменные или методы уровня класса загружаются до методов или переменных уровня экземпляра. И, очевидно, вещь, которая не загружена, не может быть использована. Поэтому java-компилятор, не позволяющий обрабатывать вещи во время выполнения, решает во время компиляции. Вот почему он дает вам ошибку, не статические вещи не могут быть переданы из статического контекста. Вам просто нужно ознакомиться с областью уровня класса, областью уровня экземпляра и локальной областью.
Ключ должен переписать этот запрос так, чтобы его можно было использовать в качестве подзапроса.
SELECT firstname,
lastname,
list.address
FROM list
INNER JOIN (SELECT address
FROM list
GROUP BY address
HAVING COUNT(id) > 1) dup
ON list.address = dup.address;
select address from list where address = any (select address from (select address, count(id) cnt from list group by address having cnt > 1 ) as t1) order by address
внутренний подзапрос возвращает строки с повторяющимся адресом, тогда внешний подзапрос возвращает столбец адресов для адреса с дубликатами. внешний суб-запрос должен возвращать только один столбец, потому что он используется как операнд для оператора «= any»
Ответ на Powerlord действительно лучший, и я бы порекомендовал еще одно изменение: используйте LIMIT, чтобы убедиться, что db не будет перегружен:
SELECT firstname, lastname, list.address FROM list
INNER JOIN (SELECT address FROM list
GROUP BY address HAVING count(id) > 1) dup ON list.address = dup.address
LIMIT 10
Это хорошая привычка использовать LIMIT, если нет ГДЕ и при создании объединений. Начните с малого значения, проверьте, насколько тяжелен запрос, а затем увеличьте предел.
select `cityname` from `codcities` group by `cityname` having count(*)>=2
Это тот же запрос, о котором вы просили, и его 200% работает и легко. Наслаждайтесь !!!
SELECT date FROM logs group by date having count(*) >= 2
->having(DB::raw('count(*)'), '>', 2)
к запросу. Большое спасибо!
– Kovah
7 December 2015 в 15:28
Найти дубликатов пользователей по электронному адресу с этим запросом ...
SELECT users.name, users.uid, users.mail, from_unixtime(created)
FROM users
INNER JOIN (
SELECT mail
FROM users
GROUP BY mail
HAVING count(mail) > 1
) dupes ON users.mail = dupes.mail
ORDER BY users.mail;
Я попробовал лучший ответ, выбранный для этого вопроса, но это несколько смутило меня. Мне на самом деле нужно было только на одном поле из моего стола. Следующий пример из этой ссылки для меня очень хорошо работал:
SELECT COUNT(*) c,title FROM `data` GROUP BY title HAVING c > 1;
мы можем найти, что дубликаты зависят от более чем одного поля. В этих случаях вы можете использовать формат ниже.
SELECT COUNT(*), column1, column2
FROM tablename
GROUP BY column1, column2
HAVING COUNT(*)>1;
SELECT *
FROM (SELECT address, COUNT(id) AS cnt
FROM list
GROUP BY address
HAVING ( COUNT(id) > 1 ))
SELECT users.name, users.uid, users.mail, from_unixtime(created) FROM users INNER JOIN ( SELECT mail FROM users GROUP BY mail HAVING count(mail) > 1 ) dup ON users.mail = dup.mail ORDER BY users.mail, users.created;
– doublejosh
1 February 2012 в 20:34
Другим решением было бы использовать псевдонимы таблиц, например:
SELECT p1.id, p2.id, p1.address
FROM list AS p1, list AS p2
WHERE p1.address = p2.address
AND p1.id != p2.id
Все, что вы действительно делаете в этом случае, - это взять исходную таблицу list , создав два выдать таблицы - p1 и p2 - из этого, а затем выполнить соединение в столбце адреса (строка 3). 4-я строка гарантирует, что одна и та же запись не будет отображаться несколько раз в вашем наборе результатов («дублировать дубликаты»).
SELECT t.*,(select count(*) from city as tt where tt.name=t.name) as count FROM `city` as t where (select count(*) from city as tt where tt.name=t.name) > 1 order by count desc
Замените город таблицей. Замените имя именем вашего поля
select * from table_name t1 inner join (select distinct <attribute list> from table_name as temp)t2 where t1.attribute_name = t2.attribute_name
Для вашей таблицы это будет что-то вроде
select * from list l1 inner join (select distinct address from list as list2)l2 where l1.address=l2.address
. Этот запрос предоставит вам все отдельные записи в таблице списка ... Я не уверен, как это будет работать, если у вас есть значения первичного ключа для имени и т. д.
Это также покажет вам, сколько дубликатов имеет и будет заказывать результаты без объединений
SELECT `Language` , id, COUNT( id ) AS how_many
FROM `languages`
GROUP BY `Language`
HAVING how_many >=2
ORDER BY how_many DESC
Поиск дубликатов адресов намного сложнее, чем кажется, особенно если вам нужна точность. В этом случае запроса MySQL недостаточно ...
Я работаю в SmartyStreets , где мы делаем проверку и дедупликацию и другие вещи, и я видел много разных проблем с аналогичными проблемами.
Существует несколько сторонних служб, которые будут отмечать дубликаты в списке для вас. Выполнение этого только с подзапросом MySQL не будет учитывать различия в форматах и стандартах адресов. У USPS (для адреса США) есть определенные рекомендации по составлению этих стандартов, но только несколько поставщиков сертифицированы для выполнения таких операций.
Итак, я бы рекомендовал, что лучшим ответом для вас является экспорт таблицы в CSV-файл, например, и отправить его в обработчик способных списков. Одним из таких является LiveAddress , который будет выполнен для вас за несколько секунд до нескольких минут автоматически. Он будет отмечать повторяющиеся строки с новым полем «Дубликат» и значением Y
в нем.
Это выберет дубликаты в одном проходе таблицы, не будет подзапросов.
SELECT *
FROM (
SELECT ao.*, (@r := @r + 1) AS rn
FROM (
SELECT @_address := 'N'
) vars,
(
SELECT *
FROM
list a
ORDER BY
address, id
) ao
WHERE CASE WHEN @_address <> address THEN @r := 0 ELSE 0 END IS NOT NULL
AND (@_address := address ) IS NOT NULL
) aoo
WHERE rn > 1
Этот запрос активирует действие ROW_NUMBER()
, присутствующее в Oracle
и SQL Server
См. статью в моем блоге для деталей:
MySQL
. FROM (SELECT ...) aoo
является подзапросом: -P
– Rocket Hazmat
27 April 2012 в 20:07
Почему не просто INNER ПРИСОЕДИНЯЙТЕСЬ к таблице с собой?
SELECT a.firstname, a.lastname, a.address
FROM list a
INNER JOIN list b ON a.address = b.address
WHERE a.id <> b.id
Требуется DISTINCT, если адрес может существовать более двух раз.
WHERE a.id > b.id
, чтобы отфильтровать только новые дубликаты, таким образом, я могу сделать DELETE
непосредственно на результат. Переключите сравнение, чтобы просмотреть старые дубликаты.
– Stoffe
11 September 2013 в 08:30
Процедура быстрого удаления дубликатов:
/* create temp table with one primary column id */
INSERT INTO temp(id) SELECT MIN(id) FROM list GROUP BY (isbn) HAVING COUNT(*)>1;
DELETE FROM list WHERE id IN (SELECT id FROM temp);
DELETE FROM temp;
Лично этот запрос решил мою проблему:
SELECT `SUB_ID`, COUNT(SRV_KW_ID) as subscriptions FROM `SUB_SUBSCR` group by SUB_ID, SRV_KW_ID HAVING subscriptions > 1;
Что делает этот скрипт, показывает все идентификаторы подписчика, которые существуют более одного раза в таблице, и количество найденных дубликатов.
Это столбцы таблицы:
| SUB_SUBSCR_ID | int(11) | NO | PRI | NULL | auto_increment |
| MSI_ALIAS | varchar(64) | YES | UNI | NULL | |
| SUB_ID | int(11) | NO | MUL | NULL | |
| SRV_KW_ID | int(11) | NO | MUL | NULL | |
Надеюсь, это будет полезно и вам!
Разве это не так:
SELECT *
FROM tc_tariff_groups
GROUP BY group_id
HAVING COUNT(group_id) >1
?
Find duplicate Records:
Suppose we have table : Student
student_id int
student_name varchar
Records:
+------------+---------------------+
| student_id | student_name |
+------------+---------------------+
| 101 | usman |
| 101 | usman |
| 101 | usman |
| 102 | usmanyaqoob |
| 103 | muhammadusmanyaqoob |
| 103 | muhammadusmanyaqoob |
+------------+---------------------+
Now we want to see duplicate records
Use this query:
select student_name,student_id ,count(*) c from student group by student_id,student_name having c>1;
+--------------------+------------+---+
| student_name | student_id | c |
+---------------------+------------+---+
| usman | 101 | 3 |
| muhammadusmanyaqoob | 103 | 2 |
+---------------------+------------+---+