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

其中设计了结构均为相同的项有(不必全表相同,只需链接的项):

[sql]  view plain copy
  1. `id` int(10) NOT NULL AUTO_INCREMENT,  
  2.         `title` varchar(100) DEFAULT NULL,       //标题  
  3.         `tablenm` varchar(10) DEFAULT NULL,      //表名,方便查找  
  4.         `pageview` int(10) DEFAULT NULL,       //浏览数  
  5.          `pubtime` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,   //发布时间         
  6.          PRIMARY KEY (`id`)  



于是可以这样连接查询了:

[php]  view plain copy
  1. $hotnews=mysql_query("SELECT id,title,pageview,tablenm FROM News   
  2. UNION  
  3. SELECT id,title,pageview,tablenm FROM Informs  
  4. UNION  
  5. SELECT id,title,pageview,tablenm FROM Article  
  6. UNION  
  7. SELECT id,title,pageview,tablenm FROM IntroORDER BY pageview DESC limit 15",$conn);//获取在四个表中按浏览数高低排序的前15个文章  

或者以发布时间为条件,将ORDER句换成如下即可

[php]  view plain copy
  1. ORDER BY pubtimew DESC limit $limit  
  2. //$limit可设为需列举的数  

注意一点表项的结构必须相同,比如两个表的id int(10)   如果其中一个换成id int(9) 也不行,查询将会报错。但可以有不同的名称(不推荐),查询结果列将以SQL收到的第一份列名为准输出

整个过程非常轻松,强大的SQL方法,省却了将工作上升到脚本层的情况。不再去用各种繁杂的字符串比较来完成。


再提一点,默认的UNION只获取表中不同的值,有相同的重复条目会被忽略,如果要计入重复条目,则使用UNION ALL 语法,用法相同。


我的使用结果:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值