求教一个SQL的写法

id title country
1 The news zh
2 the two news zh
3 the three news jp
4 the four news jp

表结构大概如上,是个类似资讯表。现在需要选出指定几个国家的6条资讯,即为指定的几个国家分别选出6条记录来展示。
个人想到用union来一次性选出符合的记录。各位大大是否有更好,高效的方法呢?

阅读 4.5k
5 个回答

提供一个思路,我个人在实际项目中更倾向于此种方法。

不要什么问题都非得一句SQL搞定问题,这样SQL难以维护,而且也不利于mysql去缓存查询结果。
看你的问题描述更像是要展示特定信息,而且是很可能持续展示同样的查询结构。

我的建议:
将查询拆分成多个子查询,在外层代码中进行循环查询,最后合并查询结果。
其查询结果在代码中进行缓存,定时刷新缓存以减少反复查询。

一条SQL执行起来不难,比如这样(可能不完全符合题主的要求):

select substring_index(GROUP_CONCAT(TITLE SEPARATOR '\n'),'\n',6) from NEWS group by COUNTRY 

尽管如此,但我赞同 @AntonyBi 的观点。
如果表关系有些复杂的话,建议不要试图用一条SQL拯救世界。

SQLServer中可以使用ROW_NUMBER()函数实现。

SELECT n.*
  FROM news n
  JOIN (SELECT id,
               ROW_NUMBER() OVER(PARTITION BY country 
                                     ORDER BY id) AS rid
          FROM news
         WHERE country IN('zh','jp')) m ON n.id = m.id AND m.rid <= 6
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题