爲了方便明顯的看出效果,我們先建立一張新聞表(news),表的結構如下:
現在我要去對這批數據進行排序,排序規則如下
1)點擊率最高且title爲今日焦點的放在最上面。
2)其餘的按照更新時間排序
一、第一個想到的就是用unoin進行聯合查詢:
select * from news where title=“今日焦點” order by click desc
unoin all
select * from news order by modified_at desc
結果提示:
原來 爲了對單個SELECT 使用ORDER BY 或LIMIT ,應把子句放入圓括號中。於是把語句改爲
(select * from news where title=“今日焦點” order by click desc)
unoin all
(select * from news order by modified_at desc)
二、查詢之後發現有重複的數據 ,因爲第二個查詢查詢的是所有的記錄,第一個查詢是部分記錄。
1)在第二個select 查詢中做限定,查出title不爲sql的所有語句
2)或者吧unoin all換成unoin。因爲unoin會將聯合查詢後的結果集得重複記錄去掉
三、你發現結果集並不像你想象的那樣排序
你想要的排序結果是(2、1、6、3、4、5、7、11、9、12、13、8)
但是查詢出來的排序結果是(1、2、3、4、5、6、7、8、9、11、12、13)
她貌似對結果集按照id進行了重新排序,原因是: 圓括號中用於單個SELECT 語句的ORDER BY 只有當與LIMIT 結合後,才起作用。否則,ORDER BY 被優化去除。
(select * from news where title=“今日焦點” order by click desc limit 100)
unoin all
(select * from news order by modified_at desc limit 100)
這樣就可以獲取到你要的結果集了。
但是問題是我的limit值到底要設置爲多大了,有一點可以肯定的,根據開頭說的需求,這個limit的值最好是比數據庫中記錄的條數大,不然查詢出來的數據會不完整。這樣也就限制了整個sql語句的靈活性。但是根據官方文檔的描述,如果選用unoin聯合查詢的話,必須要這樣做了。其他方法我一時間還想不出來。