Mysql 按字段值限制行


Mysql Limit rows by field value

我正在使用PHP和MySQL开发简单的应用程序。到目前为止,我们需要在 HTML 表中显示数据库中的项目。还实现了简单的分页。它看起来像这样:

 +----+---------------------+ 
 |  1 | Item 1              |
 +----+---------------------+
 |  2 | Item 2              |
 +----+---------------------+
 |  3 | Item 3              |
 +----+---------------------+
 |  4 | Item 4              |
 +----+---------------------+
            ....
 +----+---------------------+
 |  5 | Item 25             |
 +----+---------------------+

不是火箭科学。现在我们添加了新功能,以便我们可以(可选(对项目进行分组 - 我们确实创建了"很多"相同的项目。我们决定在数据库中添加名为 groupID 的新列 - 对于未包含在任何组中的项目,它可以是数字或 NULL。在网页上,我们必须将其显示为一个元素,当您单击它时它会展开。

+----+---------------------+ 
|  1 | Item 1              |
+----+---------------------+
|  2 | Item 2              |
+----+---------------------+
|  3 | Item 3              |
+----+---------------------+
|  4 | Group 1 (Expanded)  |
+----+---------------------+
     | Group 1 Item 1      |
     +---------------------+
     | Group 1 Item 2      |
     +---------------------+
     | Group 1 Item 3      |
+----+---------------------+
           ....
+----+---------------------+
|  25| Item 25             |
+----+---------------------+

如您所见,一页上的项目数量可能会有所不同,因此我们必须将组中的项目视为一个项目,因此简单的"限制 25"不再有效。我想知道我是否可以进行一些聪明的 mysql 查询,该查询将以这种方式工作。我宁愿避免在数据库中创建新表,该表由组和与项目表的关系组成,因为大多数组只有 1 个项目。我不相信这个功能会被大量使用,但你知道 - 客户。此外,这个系统在生产中工作了一段时间,所以我宁愿避免这样的更改。知道如何让它工作吗?也请尽可能保持简单,因为这个例子是简化的。实际查询已经有点复杂了。

我还想避免通过 PHP 代码解析它,因为查询所有几千行然后丢弃除 25-50 个元素之外的所有元素是愚蠢的。

正如您所说,某些组 ID 可以为空,我认为我们应该解决这个问题。

null时,我们使用项 ID 来表示组,并使用前缀来确保我们的新group_id是唯一的。

这是我使用子查询的解决方案(不漂亮,但似乎有效(:

SELECT 
    i1.id,
    i1.itemgroup1
FROM (
    SELECT 
        items.id,
        IF(ISNULL(items.group_id), 
           CONCAT('alone-', items.id), 
           CONCAT('group-', items.group_id)) as itemgroup1
    FROM
    items
) as i1
RIGHT JOIN (
    SELECT 
        items.id,
        IF(ISNULL(items.group_id), 
        CONCAT('alone-', items.id), 
        CONCAT('group-', items.group_id)) as itemgroup2
    FROM
        items
    GROUP BY itemgroup2
    LIMIT 2
) as i2 on i2.itemgroup2 = i1.itemgroup1

**更新**

删除

 WHERE
        items.group_id IS NOT NULL