mysql中的聯合查詢

爲了方便明顯的看出效果,我們先建立一張新聞表(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聯合查詢的話,必須要這樣做了。其他方法我一時間還想不出來。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章