本文共 1265 字,大约阅读时间需要 4 分钟。
用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 语法,用法相同。
我的使用结果:
转载地址:https://blog.csdn.net/weixin_34237700/article/details/113653383 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!