我正在使用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