您的位置:首页 > 数据库 > MySQL

Mysql中使用UNION语句进行多表连接查询

2013-04-10 07:34 856 查看
用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 语法,用法相同。

我的使用结果:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐