我正在使用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个元素之外的所有行都是愚蠢的。
答案 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