DISTINCT вытягивает повторяющиеся значения столбца - PullRequest
1 голос
/ 12 февраля 2011

Следующий запрос извлекает дубликаты site_id s, со мной, используя DISTINCT, я не могу понять, почему ...

SELECT
    DISTINCT site_id,
    deal_woot.*,
    site.woot_off,
    site.name AS site_name
FROM deal_woot
INNER JOIN site ON site.id = site_id
WHERE site_id IN (2, 3, 4, 5, 6)
ORDER BY deal_woot.id DESC LIMIT 5

Ответы [ 4 ]

2 голосов
/ 12 февраля 2011

DISTINCT просматривает всю запись , а не только столбец сразу после нее.Чтобы выполнить то, что вы хотите, вам нужно использовать GROUP BY:

нерабочий код:

SELECT
    site_id,
    deal_woot.*,
    site.woot_off,
    site.name AS site_name
FROM deal_woot
INNER JOIN site ON site.id = site_id
WHERE site_id IN (2, 3, 4, 5, 6)
GROUP BY site_id

Почему это не работает?Если вы GROUP BY столбец, вы должны использовать статистическую функцию (например, MIN или MAX) для остальных столбцов - в противном случае, если для данного site_id есть несколько site_woot_off с,SQL не ясно, какое из этих значений вы хотите SELECT.

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

Примечание: если вы используете MySQL, я считаю, что технически необязательно указывать статистическую функцию для оставшихся столбцов.Если вы не указываете статистическую функцию для столбца, она выбирает для вас значение одного столбца (обычно первое значение в наборе результатов).

2 голосов
/ 12 февраля 2011

Ваш запрос возвращает DISTINCT строк, он не просто смотрит на site_id. Другими словами, если какой-либо из столбцов отличается, из этого запроса возвращается новая строка.

Это имеет смысл, потому что, если у вас действительно есть различия, что сервер должен возвращать в качестве значений для deal_woot.*? Если вы хотите сделать это, вам нужно указать это - возможно, это делается путем получения отдельных site_id, а затем получения LIMIT 1 других значений в подзапросе с подходящим предложением ORDER BY.

0 голосов
/ 12 февраля 2011

Если вы хотите выбрать информацию о сайте и одну строку из таблицы deal_woot с тем же идентификатором site_id, вам нужно использовать другой запрос.Например,

SELECT site.id, deal_woot.*, site.woot_off, site.name
FROM site 
INNER JOIN 
   (SELECT site_id, MAX(id) as id FROM deal_woot 
     WHERE site_id IN (2,3,4,5,6) GROUP BY site_id) X 
ON (X.site_id = site.id)
INNER JOIN deal_woot ON (deal_woot.id = X.id)
WHERE site.id IN (2,3,4,5,6);

Этот запрос должен работать независимо от поставщика sql dialect / db.Для mysql вы можете просто добавить group by site_id к исходному запросу, поскольку он позволяет использовать GROUP BY без агрегатных функций.
** Я предполагаю, что deal_woot.id и site.id являются первичными ключами для deal_wootsite таблиц соответственно.

0 голосов
/ 12 февраля 2011

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

...