2013-03-31 2 views
-2

Есть ли способ сделать один выбор, который получает 10 новейших автомобилей с автомобильного стола, где 5 из них красные, а 5 из них синие?SQL выбрать пять из этого и пять из них

Лучшим, что я могу придумать два выбирает и программное слияние:

red = query("select * from cars where color = 'red' order by when desc limit 5") 
blue = query("select * from cars where color = 'blue' order by when desc limit 5") 
all = merge(red, blue) 
+1

Вы отметили это как с MySQL и PostgreSQL, какую базу данных вы используете? Пометив его правильной СУБД, ваш вопрос может получить внимание от людей, более подходящих для ответа на него. – Taryn

+0

Этот вопрос не показывает никаких исследований. Очень важно сделать домашнее задание **. Расскажите нам, что вы нашли, и *** почему *** это не соответствовало вашим потребностям. Это демонстрирует, что вы потратили время, чтобы попытаться помочь себе, это избавляет нас от повторения очевидных ответов и, прежде всего, помогает вам получить более конкретный и релевантный ответ. [FAQ] (http://stackoverflow.com/questions/how-to-ask). – Kermit

+0

Как ваши таблицы (таблицы) структурированы? – MichaelRushton

ответ

0

Поскольку MySQL не поддерживает CTE и Window Function как любую другую СУБД, вы можете использовать коррелированный подзапрос на этом,

SELECT a.* 
FROM Cars a 
WHERE a.Color IN ('Red', 'Blue') AND 
     (
      SELECT COUNT(*) 
      FROM Cars b 
      WHERE b.Color IN ('Red', 'Blue') AND 
        a.Color = b.Color AND 
        a.time >= b.time 
     ) <= 5 

POSTGRESQL

WITH carList 
AS 
(
    SELECT Col1, Col2, Col3, Color, 
      ROW_NUMBER() OVER (PARTITION BY Color ORDER BY time DESC) rn 
    FROM tableName 
) 
SELECT Col1, Col2, Col3, Color 
FROM carList 
WHERE Color IN ('Red', 'Blue') AND 
     RN <= 5 
+0

@J W: Интересно! Как решить эту проблему с помощью Postgres/Window? Я рассматриваю возможность перехода на Postgres в какой-то момент. – forthrin

+0

@forthrin см. Мой обновленный ответ. 'Col1, .., Col3' - это просто имена столбцов образца. hehe –

2

Для MySQL попробовать:

select * from cars where color = 'blue' order by releasedate desc limit 5 
Union 
select * from cars where color = 'red' order by releasedate desc limit 5 
+0

Является ли союз самым дорогим, как два отдельных выбора? – forthrin

+1

Я думаю, что СОЮЗ ВСЕ лучше. Вот предыдущий вопрос, связанный с сопоставлением производительности между объединенными и отдельными запросами. Http://stackoverflow.com/questions/12590596/mysql-union-time-v-s-separate-query-one-by-one – Crwydryn

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