1. 程式人生 > >Mysql中使用UNION語句進行多表連線查詢

Mysql中使用UNION語句進行多表連線查詢

用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 語法,用法相同。

我的使用結果: