Mysql中使用UNION語句進行多表連線查詢
阿新 • • 發佈:2019-01-26
用PHP編寫了幾個網頁,直接使用內建函式連結Mysql資料庫。在實用中遇到一個需求:有幾個內容相類似的表(存放了新聞、公告類文章),想要以某些條件做出在幾個表上的共同查詢和排序模組。
例如以文章的點選數多少、釋出時間的先後為條件,動態生成有用的排序列表(最新文章、最熱點選等)。發現用SQL語句的UNION能輕鬆完成,而不用上升到指令碼的層面了。
在標準SQL中的UNION語句如下:
SELECT column_name(s) FROM table_name1 UNION SELECT column_name(s) FROM table_name2
其中有前提:每個SELECT的內容(表項)必須是相同的結構。詳細的說,連結的表的列數必須互相相同,同時相對的列屬性也必須相同。而列名可以不同(結構相同)
我有以下幾個表:
News,Informs,Article,Intro
其中設計了結構均為相同的項有(不必全表相同,只需連結的項):
`id` int(10) NOT NULL AUTO_INCREMENT, `title` varchar(100) DEFAULT NULL, //標題 `tablenm` varchar(10) DEFAULT NULL, //表名,方便查詢 `pageview` int(10) DEFAULT NULL, //瀏覽數 `pubtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, //釋出時間 PRIMARY KEY (`id`)
於是可以這樣連線查詢了:
$hotnews=mysql_query("SELECT id,title,pageview,tablenm FROM News
UNION
SELECT id,title,pageview,tablenm FROM Informs
UNION
SELECT id,title,pageview,tablenm FROM Article
UNION
SELECT id,title,pageview,tablenm FROM IntroORDER BY pageview DESC limit 15",$conn);//獲取在四個表中按瀏覽數高低排序的前15個文章
或者以釋出時間為條件,將ORDER句換成如下即可
ORDER BY pubtimew DESC limit $limit
//$limit可設為需列舉的數
注意一點表項的結構必須相同,比如兩個表的id int(10) 如果其中一個換成id int(9) 也不行,查詢將會報錯。但可以有不同的名稱(不推薦),查詢結果列將以SQL收到的第一份列名為準輸出
整個過程非常輕鬆,強大的SQL方法,省卻了將工作上升到指令碼層的情況。不再去用各種繁雜的字串比較來完成。
再提一點,預設的UNION只獲取表中不同的值,有相同的重複條目會被忽略,如果要計入重複條目,則使用UNION ALL 語法,用法相同。
我的使用結果: