【问题标题】:MySQL: How to get five posts from each user?MySQL:如何从每个用户那里获得五个帖子?
【发布时间】:2016-04-05 13:53:03
【问题描述】:

我想从一个表中选择用户,并通过为每个表设置 LIMIT 5 来检查另一个表中的 id

这是我拥有的,但我不能重用,第二个联合中的 a.id

SELECT a.id AS USER,
       p.id AS post_id
FROM (
        (SELECT a.id
         FROM `user` a
         WHERE a.date=...)
      UNION
        (SELECT p.id
         FROM `post` p
         WHERE p.user_id=a.id LIMIT 5)`` `) AS post

谢谢你,哈哈

【问题讨论】:

  • 通常,如果您想查看一个表中的值并查看它们是否存在于另一个表中,您会使用连接。你能解释一下你想要完成什么吗?也许可以举例说明您的源数据以及您希望输出的样子。
  • 我只想从每个用户那里获得 5 个帖子

标签: php mysql join left-join


【解决方案1】:

查询可能如下所示:

主要查询:

SELECT 
t.userID,
t.postID
FROM 
(
         SELECT
          user.id AS userID,
          post.id AS postID,
          IF (@prev = post.user_id ,@cn := @cn + 1 ,@cn := 0) SL,
          @prev := post.user_id
        FROM (SELECT @cn := 0, @prev := 0) var,post
        INNER JOIN user ON user.id = post.user_id
        ORDER BY post.user_id) t
WHERE t.SL < 5;

查询将为每个用户挑选 5 个帖子。


测试:

无法添加 SQL FIDDLE。

所以这里有一些带有模式的测试数据来检查查询。

DROP TABLE IF EXISTS `post`;
CREATE TABLE `post` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL,
  PRIMARY KEY (`id`)
);

INSERT INTO `post` VALUES ('1', '71');
INSERT INTO `post` VALUES ('2', '66');
INSERT INTO `post` VALUES ('3', '66');
INSERT INTO `post` VALUES ('4', '71');
INSERT INTO `post` VALUES ('5', '66');
INSERT INTO `post` VALUES ('6', '71');
INSERT INTO `post` VALUES ('7', '71');
INSERT INTO `post` VALUES ('8', '71');
INSERT INTO `post` VALUES ('9', '66');
INSERT INTO `post` VALUES ('10', '66');
INSERT INTO `post` VALUES ('11', '66');
INSERT INTO `post` VALUES ('12', '66');
INSERT INTO `post` VALUES ('13', '71');
INSERT INTO `post` VALUES ('14', '91');

DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`id`)
);
INSERT INTO `user` VALUES ('66');
INSERT INTO `user` VALUES ('71');
INSERT INTO `user` VALUES ('91');


SELECT 
*
FROM post;

结果:

id  user_id
1   71
2   66
3   66
4   71
5   66
6   71
7   71
8   71
9   66
10  66
11  66
12  66
13  71
14  91

SELECT * FROM user;

结果:

id
66
71
91

每个用户查询的帖子总数:

SELECT 
user_id,
COUNT(*) totalPost
FROM post 
GROUP BY user_id;

结果:

user_id  totalPost
66         7
71         6
91         1

最终结果:

userID postID
66       2
66       3
66       5
66       12
66       11
71       1
71       13
71       8
71       7
71       6
91       14

【讨论】:

  • 我可以将WHERE t.SL &lt; 5 放在 (..) t 之间吗?因为我需要将另一个表联合到这个...
  • 不,伙计!如果要与另一个表联合,则必须使用此结果集。只需确保这对您有用。
  • 所以无论我有多少个工会,我都需要在选择结束时添加WHERE t.SL &lt; 5
  • 如果您分享那些将成为UNION 一部分的查询,那就太好了。
  • 改用HAVING COUNT(...) &lt; 5怎么样?
猜你喜欢
  • 1970-01-01
  • 2013-05-29
  • 2018-11-20
  • 1970-01-01
  • 2019-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-04
相关资源
最近更新 更多