【问题标题】:MySql, limint number of articles in each categoryMySql,限制每个类别的文章数量
【发布时间】:2018-03-12 22:44:07
【问题描述】:

我正在尝试创建一个简单的新闻网站,我想在主页上显示所有类别,并将每个类别中的文章数量限制为 5。这是我目前得到的。

表格类别

id    name    
========================================
1    World
2    Sports
3    Economy
4    Music

表格文章

id   category_id  name  
===============================
1    1            Article 1
2    1            Article 2
3    1            Article 3
4    2            Article 11
5    2            Article 22
6    3            Article 33
7    4            Article 111
8    3            Article 222
9    3            Article 333

和我的查询:

SELECT
  a.category_id,
  c.name as catname,
  a.name as artname
FROM
  categories AS c
  LEFT JOIN articles AS a
    ON a.category_id = c.id
LIMIT 5;

问题是限制应用于类别表,但我实际上需要应用于文章表。

【问题讨论】:

  • "问题是限制应用于类别表,但我实际上需要应用于文章表。"没有限制应用于结果集而不是 anny 表
  • 您需要使用 MySQL 的用户变量来生成 row_number 并过滤该 row_number。在 simulate row_number mysql 或 ranking mysql 上的 stackoverflow 上搜索您应该找到一些示例

标签: php mysql


【解决方案1】:

如果你有一个更新的 MySQL 版本,你可以使用这样的查询: 您只需指定要查看的字段

SELECT c.*,a.*
FROM categories c
LEFT JOIN (
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id DESC ) AS rnr
        FROM articles ) a 
    ON c.id = a.category_id
WHERE rnr < 4
ORDER BY c.id, rnr;

示例

MariaDB [bernd]> select * from articles;
+----+-------------+-------------+
| id | category_id | name        |
+----+-------------+-------------+
|  1 |           1 | Article 1   |
|  2 |           1 | Article 2   |
|  3 |           1 | Article 3   |
|  4 |           2 | Article 11  |
|  5 |           2 | Article 22  |
|  6 |           3 | Article 33  |
|  7 |           4 | Article 111 |
|  8 |           3 | Article 222 |
|  9 |           3 | Article 333 |
+----+-------------+-------------+
9 rows in set (0.00 sec)

MariaDB [bernd]> SELECT c.*,a.*
    -> FROM categories c
    -> LEFT JOIN (
    ->     SELECT
    ->         *,
    ->         ROW_NUMBER() OVER (PARTITION BY category_id ORDER BY id DESC ) AS rnr
    ->         FROM articles ) a
    ->     ON c.id = a.category_id
    -> WHERE rnr < 4
    -> ORDER BY c.id, rnr;
+----+---------+------+-------------+-------------+------+
| id | name    | id   | category_id | name        | rnr  |
+----+---------+------+-------------+-------------+------+
|  1 | World   |    3 |           1 | Article 3   |    1 |
|  1 | World   |    2 |           1 | Article 2   |    2 |
|  1 | World   |    1 |           1 | Article 1   |    3 |
|  2 | Sports  |    5 |           2 | Article 22  |    1 |
|  2 | Sports  |    4 |           2 | Article 11  |    2 |
|  3 | Economy |    9 |           3 | Article 333 |    1 |
|  3 | Economy |    8 |           3 | Article 222 |    2 |
|  3 | Economy |    6 |           3 | Article 33  |    3 |
|  4 | Music   |    7 |           4 | Article 111 |    1 |
+----+---------+------+-------------+-------------+------+
9 rows in set (0.00 sec)

MariaDB [bernd]>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-01
    • 1970-01-01
    • 2014-09-25
    • 2015-10-05
    相关资源
    最近更新 更多