mysql检索数据给出限制和子限制

时间:2014-01-13 07:56:03

标签: mysql codeigniter-2

我有一个名为item的表,其中包含类别ID和项ID。 项目ID是主键,每个项目与类别ID相关。

我想要检索20个项目,但是要检索一个类别的4个项目。如果没有4项 某个类别,然后选择此类别中的所有项目。

这是我的查询,它不起作用:

SELECT * FROM `item`
JOIN (SELECT `item_id` FROM `item` GROUP BY `category_id` LIMIT 4) LIMIT 20;

我的桌子结构

项目

item id     |   category id
----------------------------
1           |   1
2           |   1
3           |   2
4           |   2
5           |   1
6           |   3

如果我的桌子有

类别

category    |   count(item)
-----------------------------
1           |   5
2           |   3
3           |   10
4           |   8   
5           |   12
6           |   6
7           |   6
8           |   6

我想选择20个这样的项目 此类别中的类别项目

----------
1   |   4
2   |   3
3   |   4
4   |   4
5   |   4
6   |   1

1 个答案:

答案 0 :(得分:2)

您可以尝试此查询

SET @level = 0;
SET @group = '';
SELECT 
    item_id,
    category_id
FROM (
    SELECT 
        item_id,
        category_id,
        @level := IF(@group = category_id, @level+1, 1) AS level, 
        @group := category_id as EGroup 
    FROM item
    ORDER BY category_id 
) rs
WHERE level < 5 

以下是一些示例数据

| ID | ITEM_ID | CATEGORY_ID |
|----|---------|-------------|
|  1 |       1 |           1 |
|  2 |       2 |           1 |
|  3 |       3 |           1 |
|  4 |       4 |           1 |
|  5 |       5 |           1 |
|  6 |       6 |           2 |
|  7 |       7 |           2 |
|  8 |       8 |           2 |
|  9 |       9 |           2 |
| 10 |      10 |           3 |
| 11 |      11 |           3 |
| 12 |      12 |           3 |
| 13 |      13 |           3 |
| 14 |      14 |           3 |
| 15 |      15 |           3 |
| 16 |      16 |           4 |
| 17 |      17 |           4 |
| 18 |      18 |           5 |
| 19 |      19 |           5 |
| 20 |      20 |           5 |
| 21 |      21 |           5 |
| 22 |      22 |           5 |
| 23 |      23 |           6 |
| 24 |      24 |           7 |
| 25 |      25 |           7 |

输出

| ITEM_ID | CATEGORY_ID |
|---------|-------------|
|       1 |           1 |
|       2 |           1 |
|       3 |           1 |
|       4 |           1 |
|       9 |           2 |
|       8 |           2 |
|       7 |           2 |
|       6 |           2 |
|      15 |           3 |
|      14 |           3 |
|      13 |           3 |
|      12 |           3 |
|      16 |           4 |
|      17 |           4 |
|      22 |           5 |
|      21 |           5 |
|      20 |           5 |
|      19 |           5 |
|      23 |           6 |
|      24 |           7 |
|      25 |           7 |           

SQL Fiddle Demo