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


我的使用结果:



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值