2011-02-01 2 views
3

Как выбрать 5 строк, 1 для каждого site_id, это бросает ошибкуКак выбрать 5 различных строк

SELECT DISTINCT site_id, * 
FROM deal 
WHERE site_id IN (2, 3, 4, 5, 6) 
ORDER BY id 
DESC LIMIT 5 

У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, соответствующее версии вашего сервера MySQL, для правильного синтаксиса для использования рядом с * * FROM deal WHERE site_id IN (2, 3, 4, 5, 6) ORDER BY id DESC LIMIT 5 'в строке 1 "

ответ

4

Попробуйте использовать GROUP BY

SELECT * 
FROM deal 
WHERE site_id IN (2, 3, 4, 5, 6) 
GROUP BY site_id 
ORDER BY id DESC 
LIMIT 5; 
+0

Doh! Дух, я должен был подумать об этом! – Webnet

+0

Довольно хорошо. Обратите внимание, что SELECTING столбцы, которые не находятся в GROUP_BY, являются расширением MYSQL, и нет гарантии, что строки будут возвращены. (Так что, если он хочет тот, у которого есть максимальный идентификатор, нет гарантии, что он его получит.) –

+0

@ Кен вы правы - если он хочет больше, чем одну строку, любую строку для каждого идентификатора сайта, то ваше решение что ему нужно. –

1

Если таблица позволяет дублирующие site_ids, и вам нужно только, чтобы показать один за Site_ID, то при условии, ID является уникальным

SELECT * FROM deal 
WHERE id in (
    SELECT max(id) maxid 
    FROM deal 
    WHERE site_id IN (2, 3, 4, 5, 6) 
    GROUP by site_id 
) 
0

вы не можете указать DISTINCT Site_ID, а также введите * wildcard. Если вы nt, чтобы указать отдельный файл site_id, тогда вам нужно удалить подстановочный знак и указать другие поля, которые вы хотите использовать.

+0

-1: Вы определили проблему. Теперь вы можете сказать ему, как его решить? –

+0

Я думал, что я довольно конкретный. Если вы хотите указать отдельный файл site_id, вам нужно удалить подстановочный знак и указать другие поля, которые вы хотите использовать. Поскольку я не знаю, какие поля он хочет использовать, я могу дать ему только инструкции. Либо удалите подстановочный знак, либо удалите отдельный site_id. –

+0

Если он задает другие поля, то он получает разные значения по всем им (даже если идентификатор сайта дублируется). В SQL можно использовать 'DISTINCT *', что дает вам все разные строки, поэтому я подозреваю, что проблема синтаксиса находится в 'site_id, *' (где 'site_id' уже покрывается * *. –

1

Сначала получите один конкретный идентификатор сделки (максимальный) для каждого сайта. (Внутренний запрос.) Затем получите полную строку для каждой из этих идентификаторов сделки. (Внешний запрос.)

SELECT * FROM deal 
WHERE id in (
    SELECT max(id) maxid 
    FROM deal 
    WHERE site_id IN (2, 3, 4, 5, 6) 
    GROUP_BY site_id 
) 

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

 WHERE site_id IN (2, 3, 4, 5, 6) 
+0

Почему только выбрать максимальный id? –

+0

@Brent: # 1: Я исправляю ответ cyberkiwi. # 2: вы должны выбрать конкретный * один * как-то.# 3: Я предполагаю, что цель «ORDER BY id» в запросе, опубликованном в вопросе, заключалась в том, чтобы получить максимальный идентификатор (хотя из его взглядов, если его запрос можно заставить работать, он фактически использовал бы 'min (id) '.) –

+0

Хорошо, я думал, что, возможно, что-то пропустил. Первоначальный вопрос был немного неоднозначным. Я подозреваю, что site_id уникален, поэтому никаких дополнительных условий не потребуется. –

Смежные вопросы