MySQL 变量仅用于计数而不在 SELECT 部分返回给客户端
Use MySQL variable only for counting without returning to client in SELECT part
TL;DR
我使用了一个 MySQL 变量,该变量每行有条件地递增。此变量仅在 HAVING
子句中是必需的,但也强制 select 用于递增。
是否可以在不 select 将其值返回给客户端的情况下为每一行递增变量?
带有解释和示例的上下文
VBulletin 论坛软件将线程回复存储在 post
table 中,其中有一列 visible
。 0表示等待解锁,1可见,2软删除。我正在处理 MySQL 查询,该查询获取页面的 posts(通常为 10)。用户应该只看到 post 和 visible = 1
,但版主也应该看到其他人。
首先我想根据用户组进行过滤。但这会使我的寻呼混乱,因为 post 可能在例如访客的第 2 页,版主在第 3 页,因为 deleted/not 已批准 posts 存在于此页面之前。
出于这个原因,我的想法是 select 所有 post 个 ID,并且只将 visible = 1
每页限制为 10 个 ID。如果第一页包含 10 个可见的 posts 和 2 个已删除的 posts,那么 mods 将获得 12 posts 而普通用户只有 10 个。但是两者的分页是相同的,因为已删除posts 不会改变它。
受 this question 启发,我构建了以下查询:
SET @visible_sum = 0;
SELECT postid, visible, @visible_sum := @visible_sum + IF(visible = 1, 1, 0)
FROM post
WHERE threadid = 38325
GROUP BY postid
HAVING @visible_sum < 10
ORDER BY dateline;
如您所见,我得到了 10 个未删除的 post 和另外 4 个已删除的(突出显示)。通过较少的修改,此查询可以重新用于非审核用户:
SELECT postid, visible, @visible_sum := @visible_sum + 1
...
HAVING @visible_sum < 10 AND visible = 1
所以这通常可以按要求工作。但我不喜欢我总是得到柜台的事实。我的应用程序中只使用了 post 个 ID,这意味着 SELECT postid FROM posts ...
就足够了。我不知道如何在不使用 SELECT
部分的情况下计算变量,该部分会自动生成返回给客户端的行的字段。我正在使用 MySQL,目前在 MariaDB 10.1 上。
将您的查询移动到子查询中。
SELECT postid, visible
FROM (
SELECT postid, visible, @visible_sum := @visible_sum + IF(visible = 1, 1, 0)
FROM post
CROSS JOIN (SELECT @visible_sum := 0) AS vars
WHERE threadid = 38325
HAVING @visible_sum < 10
ORDER BY dateline
) AS x
当你没有任何聚合函数时,你也不应该 GROUP BY postid
。
TL;DR
我使用了一个 MySQL 变量,该变量每行有条件地递增。此变量仅在 HAVING
子句中是必需的,但也强制 select 用于递增。
是否可以在不 select 将其值返回给客户端的情况下为每一行递增变量?
带有解释和示例的上下文
VBulletin 论坛软件将线程回复存储在 post
table 中,其中有一列 visible
。 0表示等待解锁,1可见,2软删除。我正在处理 MySQL 查询,该查询获取页面的 posts(通常为 10)。用户应该只看到 post 和 visible = 1
,但版主也应该看到其他人。
首先我想根据用户组进行过滤。但这会使我的寻呼混乱,因为 post 可能在例如访客的第 2 页,版主在第 3 页,因为 deleted/not 已批准 posts 存在于此页面之前。
出于这个原因,我的想法是 select 所有 post 个 ID,并且只将 visible = 1
每页限制为 10 个 ID。如果第一页包含 10 个可见的 posts 和 2 个已删除的 posts,那么 mods 将获得 12 posts 而普通用户只有 10 个。但是两者的分页是相同的,因为已删除posts 不会改变它。
受 this question 启发,我构建了以下查询:
SET @visible_sum = 0;
SELECT postid, visible, @visible_sum := @visible_sum + IF(visible = 1, 1, 0)
FROM post
WHERE threadid = 38325
GROUP BY postid
HAVING @visible_sum < 10
ORDER BY dateline;
如您所见,我得到了 10 个未删除的 post 和另外 4 个已删除的(突出显示)。通过较少的修改,此查询可以重新用于非审核用户:
SELECT postid, visible, @visible_sum := @visible_sum + 1
...
HAVING @visible_sum < 10 AND visible = 1
所以这通常可以按要求工作。但我不喜欢我总是得到柜台的事实。我的应用程序中只使用了 post 个 ID,这意味着 SELECT postid FROM posts ...
就足够了。我不知道如何在不使用 SELECT
部分的情况下计算变量,该部分会自动生成返回给客户端的行的字段。我正在使用 MySQL,目前在 MariaDB 10.1 上。
将您的查询移动到子查询中。
SELECT postid, visible
FROM (
SELECT postid, visible, @visible_sum := @visible_sum + IF(visible = 1, 1, 0)
FROM post
CROSS JOIN (SELECT @visible_sum := 0) AS vars
WHERE threadid = 38325
HAVING @visible_sum < 10
ORDER BY dateline
) AS x
当你没有任何聚合函数时,你也不应该 GROUP BY postid
。