Mysql按字段值限制行

时间:2016-02-14 19:39:46

标签: php html mysql

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

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

不是火箭科学。现在我们添加新功能,以便我们可以(可选)对项目进行分组 - 我们真正创建了一个“很多”相同的项目。我们决定在数据库中添加一个名为groupID的新列 - 对于未包含在任何组中的项,可以是number或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个元素之外的所有行都是愚蠢的。

1 个答案:

答案 0 :(得分:0)

正如你所说,某些群组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