mysql - 仅使用 MySQL 变量进行计数,而不在 SELECT 部分返回客户端

标签 mysql database mariadb vbulletin

TL;DR

我使用一个 MySQL 变量,该变量每行有条件地递增。此变量仅对于 HAVING 子句是必需的,但也强制选择用于增量。

是否可以增加每行的变量而不将其值返回给客户端?

带有解释和示例的上下文

VBulletin 论坛软件将话题回复存储在 post 表中,其中包含 visible 列。 0表示等待解锁,1表示可见,2表示软删除。我正在开发一个 MySQL 查询来获取页面的帖子(通常为 10 个)。用户只能看到带有 visible = 1 的帖子,但版主也应该看到其他帖子。

首先我想根据用户组进行过滤。但这会使我的寻呼变得困惑,因为帖子可能位于例如第 2 页用于访客,而第 3 页用于版主,因为此页面之前存在已删除/未批准的帖子。

因此,我的想法是选择所有帖子 ID,并仅将 visible = 1 的帖子 ID 限制为每页 10 个。如果第一页包含 10 个可见帖子和 2 个已删除帖子,那么管理员将获得 12 个帖子,而普通用户只会获得 10 个帖子。但是两者的分页是相同的,因为删除的帖子不会改变它。

灵感来自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;

enter image description here

如您所见,我收到 10 个未删除的帖子,另外还有 4 个已删除的帖子(突出显示)。通过较少的修改,此查询可以重新用于非审核用户:

SELECT postid, visible, @visible_sum := @visible_sum + 1
...
HAVING @visible_sum < 10 AND visible = 1

enter image description here

所以这通常可以按要求工作。但我不喜欢我总是得到柜台。我的应用程序中仅使用帖子 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

关于mysql - 仅使用 MySQL 变量进行计数,而不在 SELECT 部分返回客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57629672/

相关文章:

python - mySQLdb 连接返回截断的输出

database - 如何加密 WinForms 1.1 app.config 中的连接字符串?

sql - MariaDB:COUNT DISTINCT 是否被窃听?

MySQL优化几何查询

mysql - 使用哪种 MySQL 数据类型来四舍五入到下一个最接近的数字?

database - CakePHP 数据库表,缺少数据源默认值

mysql - 如果我尝试安装 MySQL-Server debian 将安装 mariadb-server-10.1

mysql - Maria DB 查询以选择,然后更新表以删除不需要的 HTML 和脚本标签

mysql - 如何选择没有值的列?

java - JPA:多个数据源共享实体?