Запрос на возврат только актуальных дубликатов - PullRequest
0 голосов
/ 29 февраля 2012

У меня есть таблица «обновлений», которая может содержать дубликаты описаний, и я хотел бы вернуть дубликаты вместе с их количеством, поэтому я создал этот запрос:

SELECT description, count(description) AS count
FROM updates INNER JOIN participations ON participations.status_id = updates.id
INNER JOIN customer ON customer.id = participations.customer_id
INNER JOIN garages ON garages.id = customer.garage_id
WHERE (updates.created_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY description
ORDER BY count desc

Возвращенные значения не совпадаютЯ ожидал.Я считаю, что причина в том, что многие клиенты могут делиться обновлениями, поэтому я получаю дубликаты из-за фактических дубликатов в таблице, а также потому, что одна и та же запись обновления возвращается несколько раз.Как я могу исправить запрос, чтобы он учитывал только дублирующиеся поля описания в таблице обновлений.Спасибо

Ответы [ 3 ]

3 голосов
/ 29 февраля 2012

Я думаю, что вы можете просто удалить объединения с участием и гаражами, поскольку вы не используете их ни в качестве фильтров, ни в своих полях выбора.Но если вы используете их, то это должно сделать что-то вроде этого:

SELECT description, count(description) AS count 
FROM updates
WHERE (updates.created_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH)) 
  AND EXISTS (SELECT 1 FROM participations INNER JOIN customer ON customer.id = participations.customer_id INNER JOIN garages ON garages.id = customer.garage_id WHERE participations.status_id = updates.id)
GROUP BY description 
ORDER BY count desc
1 голос
/ 29 февраля 2012

Согласно mysql manual вы можете использовать предложение HAVING с полями, сгенерированными с GROUP BY:

Предложение HAVING может ссылаться на любой столбец или псевдоним, названный в select_expr в списке SELECT или во внешних подзапросах, а также на агрегатные функции. Однако стандарт SQL требует, чтобы HAVING ссылался только на столбцы в предложении GROUP BY или столбцы, используемые в агрегатных функциях.

И пример:

SELECT COUNT(col1) AS col2 FROM t GROUP BY col2 HAVING col2 = 2; 

так что вы можете использовать свой запрос как:

SELECT description, count(description) AS count
FROM updates INNER JOIN participations ON participations.status_id = updates.id
INNER JOIN customer ON customer.id = participations.customer_id
INNER JOIN garages ON garages.id = customer.garage_id
WHERE (updates.created_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH))
GROUP BY description
HAVING count > 1
ORDER BY count desc
0 голосов
/ 29 февраля 2012

если я правильно понимаю и одно и то же описание используется для нескольких клиентов / гаражи ,, тогда вам нужно сгруппировать по всем идентификаторам уникальности, а не только description:

SELECT description, customer.id, garages.id, count(*) AS count
FROM updates
JOIN participations ON participations.status_id = updates.id
JOIN customer ON customer.id = participations.customer_id
JOIN garages ON garages.id = customer.garage_id
WHERE (updates.created_at >= DATE_SUB(CURDATE(), INTERVAL 6 MONTH))

GROUP BY description, customer.id, garages.id

HAVING count > 1
ORDER BY count desc
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...