mysql
  • sql
  • select
  • 2013-03-31 70 views -2 likes 
    -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標記這個,你使用的是什麼數據庫?通過使用正確的RDBMS標記它,您的問題可能會得到更適合回答的人的關注。 – Taryn

    +0

    此問題沒有顯示任何研究工作。 **做你的作業很重要**。告訴我們你發現了什麼,***爲什麼它不符合你的需求。這表明你已經花時間去嘗試幫助你自己了,它使我們避免重申明顯的答案,最重要的是它可以幫助你得到更具體和相關的答案。 [FAQ](http://stackoverflow.com/questions/how-to-ask)。 – Kermit

    +0

    你的桌子結構如何? – MichaelRushton

    回答

    0

    ,因爲MySQL不支持CTEWindow Function像任何其他RDBMS,你可以在此上,

    使用相關子查詢
    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'只是樣本列名稱。嘿嘿 –

    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

    我認爲UNION ALL還是更好。以下是關於union和單獨查詢性能比較的特定問題http://stackoverflow.com/questions/12590596/mysql-union-time-v-s-separate-query-one-by-one – Crwydryn

    相關問題