Выберите поля дублируются в MySQL - PullRequest
1 голос
/ 28 сентября 2011

Предполагая, что у меня есть таблица customer_offer ниже.

Мой вопрос:

Как выбрать все строки, в которых ключи (ей) *1009* дублированы в этой таблице?

+---------+-------------+------------+----------+--------+---------------------+
| link_id | customer_id | partner_id | offer_id | key    | date_updated        |
+---------+-------------+------------+----------+--------+---------------------+
|       1 |          99 |         11 |       14 | mmmmmq | 2011-09-21 12:40:46 |
|       2 |         100 |         11 |       14 | qmmmmq | 2011-09-21 12:40:46 |
|       3 |         101 |         11 |       14 | 8mmmmq | 2011-09-21 12:40:46 |
|       4 |          99 |         11 |       14 | Dmmmmq | 2011-09-21 12:59:28 |
|       5 |         100 |         11 |       14 | Nmmmmq | 2011-09-21 12:59:28 |
+---------+-------------+------------+----------+--------+---------------------+

ОБНОВЛЕНИЕ:

Большое спасибо за ваш ответ.Есть много хороших ответов.Теперь у меня есть решение.

Ответы [ 6 ]

3 голосов
/ 28 сентября 2011
select * 
from customer_offer 
where key in 
(select key from customer_offer group by key having count(*) > 1)

Обновление: Как упоминалось в @ Scorpi0, если с большой таблицей, лучше использовать соединение. А из mysql6.0 новый оптимизатор преобразует этот тип подзапросов в объединения.

1 голос
/ 28 сентября 2011
SELECT DISTINCT c1.* 
FROM customer_offer c1 
    INNER JOIN customer_offer c2
        ON c1.key = c2.key
        AND c1.link_id != c2.link_id

Предполагая, что link_id является первичным ключом.

1 голос
/ 28 сентября 2011

Self join

SELECT * FROM customer_offer c1 inner join customer_offer c2
on c1.key = c2.key

или group by поле затем принять, когда count > 1

SELECT COUNT(key),link_id FROM customer_offer c1
group by key, link_id
having COUNT(Key) > 1
0 голосов
/ 28 сентября 2011
SELECT link_id, key, count(key) as Occurrences 
FROM table 
GROUP BY key
HAVING COUNT(key)>1;
0 голосов
/ 28 сентября 2011

Используйте подзапрос для проверки количества и основной запрос для выбора строк. Запрос проверки количества выглядит просто:

SELECT `link_id` FROM `customer_offer` GROUP BY `key` HAVING COUNT(`key`) > 1

Тогда внешний запрос будет использовать это, присоединившись к нему:

SELECT customer_offer.* FROM customer_offer
INNER JOIN (SELECT `link_id` FROM `customer_offer` GROUP BY `key` HAVING COUNT(`key`) > 1) AS count_check
ON customer_offer.link_id = count_check.link_id
0 голосов
/ 28 сентября 2011

На сайте mysql много тем, в которых объясняется, как это сделать. Эта ссылка объяснит, как сделать это, используя mysql: http://forums.mysql.com/read.php?10,180556,180567#msg-180567

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

SELECT *
FROM tbl
GROUP BY key
HAVING COUNT(key)>1; 

Вы также можете использовать соединение, которое является моим предпочтительным методом, поскольку это удаляет метод медленного подсчета:

SELECT * 
FROM this_table t 
inner join this_table t1 on t.key = t1.key
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...