gpt4 book ai didi

mysql - 在 WHERE 子句中限制 SQL?

转载 作者:行者123 更新时间:2023-11-29 07:59:35 26 4
gpt4 key购买 nike

是否可以在 sql 的 WHERE 子句中设置限制?

表名称:_mct_dot

列:a_ID(自动增量)编号(索引)数量(索引)com_val

SELECT
*
FROM
_mct_dot
WHERE
(
number = 4
OR
number = 7
OR
number = 13
)
AND
(
qty = 3
OR
qty = 5
OR
qty = 7
)
ORDER BY
number ASC, qty ASC

所以上面的查询,它本质上会返回一个按顺序分组的数组。然而,它将提取值 3、5 和 7 的所有“数量”。我需要的是“数量”3、5 和 7 的 5 个结果的样本。即。我需要的结果如下:

'number' 4's with 'qty' = 3's where 'qty' limited to max 5 
'number' 4's with 'qty' = 5's where 'qty' limited to max 5
'number' 4's with 'qty' = 7's where 'qty' limited to max 5
'number' 7's with 'qty' = 3's where 'qty' limited to max 5
'number' 7's with 'qty' = 5's where 'qty' limited to max 5
'number' 7's with 'qty' = 7's where 'qty' limited to max 5
'number' 13's with 'qty' = 3's where 'qty' limited to max 5
'number' 13's with 'qty' = 5's where 'qty' limited to max 5
'number' 13's with 'qty' = 7's where 'qty' limited to max 5

最佳答案

不,无法在 WHERE 子句中添加 LIMIT 子句。

有可能获得您想要的结果集,但执行此操作的 SQL 并不漂亮。它将需要 JOIN、相关子查询或内联 View 。

<小时/>

如果 _mct_dot 中的行存在“顺序”,您可以使用相关子查询来检查您提取的行“之前”的行数,并仅获取少于四行的行。

SELECT d.*
FROM _mct_dot d
JOIN ( SELECT n.number
, q.qty
FROM (SELECT 4 AS `number` UNION ALL SELECT 7 UNION ALL SELECT 13) n
CROSS
JOIN (SELECT 3 AS `qty` UNION ALL SELECT 5 UNION ALL SELECT 7) q
) p
ON p.number = d.number
AND p.qty = d.qty
AND 5 > ( SELECT SUM(1)
FROM _mct_dot c
WHERE c.number = d.number
AND c.qty = d.qty
AND c.a_ID < d.a_ID
)
ORDER BY ...

相关子查询可能会被执行很多次,因此为了获得最佳性能,您需要一个以 numberqty 为前导列的索引,并且包括 a_id 列。

或者:

... ON `_mct_dot` (`number`, `qty`, `a_ID`)

... ON `_mct_dot` (`qty`, `number`, `a_ID`)
<小时/>

另一种选择是使用 MySQL 用户变量来模拟 row_number() 分析函数,如下所示:

SELECT t.*
FROM ( SELECT d.a_ID
, IF(d.number = @prev_number AND d.qty = @prev_qty
, @rn := @rn + 1
, @rn := 1
) AS rn
, @prev_number := d.number
, @prev_qty := d.qty
FROM (SELECT @prev_number := NULL, @prev_qty := NULL, @rn := 0 ) i
CROSS
JOIN ( SELECT n.number
, q.qty
FROM (SELECT 4 AS `number` UNION ALL SELECT 7 UNION ALL SELECT 13) n
CROSS
JOIN (SELECT 3 AS `qty` UNION ALL SELECT 5 UNION ALL SELECT 7) q
) p
JOIN _mct_dot d
ON d.number = p.number
AND d.qty = p.qty
ORDER BY d.number, d.qty
) s
JOIN _mct_dot t
ON t.a_ID = s.a_ID
WHERE s.rn <= 5
ORDER BY t.number ASC, t.qty ASC

(这些查询仅经过桌面检查;尚未设置 SQL Fiddle 演示。)

跟进

对于第一个查询,我刚刚使用了内联 View (别名为“p”),它生成所有 numberqty 值对的集合正在被请求。

我们可以使用 JOIN 操作来查找与 _mct_dot 表中的每一对匹配的所有行。

棘手的部分是相关子查询。 (我们可以使用几种方法。)上面的查询中的方法是获取具有匹配“number”和“qty”的行的“计数”,但 id 值小于该行的 id 值当前行,基本上找出当前行“之前”有多少行。我们将其与文字 5 进行比较,因为我们只想返回每组中的前 5 行。

<小时/>

对于第二个查询,

别名为i的内联 View 正在初始化一些MySQL用户变量。我们并不真正关心查询返回什么,除了它只返回一行(因为我们在 JOIN 操作中引用它)...我们真正感兴趣的是在开始时初始化变量执行。发生这种情况是因为 MySQL 在执行引用 View 的外部查询之前具体化了内联 View (派生表)。

别名为 p 的内联 View 获取我们想要检索的 number,qty 对,并且我们使用 JOIN 操作针对 _mct_dot 来获取匹配的行。

别名为s的内联 View 中的“技巧”是MySQL用户变量的使用。我们正在对照前一行的值检查当前值...如果数字和数量匹配,那么我们位于同一个“组”中,因此我们可以将行号计数器增加 1。如果任何一个值发生变化,那么它就是一个新组,因此我们将行号计数器重置为 1,因为当前行是新组中的“第一”行。

我们可以对内联 View s 运行查询,并看到我们得到行号 (rn col) 1,每组 2、3 等。

然后最外面的查询只是过滤掉 rn 行号大于 5 的所有行。实际上,从 s 中,我们仅返回该行的唯一标识符;最外面的查询还执行 JOIN 操作,以根据唯一 id 检索整行。

<小时/>

正如我在答案顶部提到的,执行此操作的 SQL 并不漂亮。 (确实需要一些工作来展开这些查询正在执行的操作。)

关于mysql - 在 WHERE 子句中限制 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24206836/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com