gpt4 book ai didi

mysql - 使用 MySql 用户变量的分歧

转载 作者:行者123 更新时间:2023-11-30 22:25:07 30 4
gpt4 key购买 nike

我有一个包含多个名称的表,我希望在搜索第二个表上的等价物之前从这些名称中删除一些后缀。

为了做到这一点,我决定将我希望修改的列存储在一个变量中,并修改该变量以便在我的第二个表中进行比较。

修改前查询:

SELECT T1.id, T1.name
FROM Table1 T1
WHERE T1.id IN (
SELECT T2.id
FROM Table2 T2
WHERE T2.textBlock like concat('%', T1.name, '%')
)

带有用户变量的新查询(为了测试,删除了对@newName 的所有操作)

SELECT *, @newName:=T1.name
FROM Table1 T1
WHERE T1.id IN (
SELECT T2.id
FROM Table2 T2
WHERE T2.textBlock like concat('%', @newName, '%')
)

第一个查询返回 590 个结果。第二个查询,即使没有修改变量,也会返回 225 个结果。是什么导致了这种结果差异?

最佳答案

一般情况下,SELECT子句中的字段在WHERE中的条件之后得到很好的处理;变量中使用的值很可能是查询执行之前碰巧的值。

我是用户/ session 变量的忠实拥护者,但跨子句使用它们非常不可靠,这也是它们声名狼藉的最大原因。

--- 你能做什么---

我不是相关子查询的忠实拥护者;他们有他们的目的,当他们真正需要的时候,很少有其他东西可以很优雅,但根据我的经验,他们很少需要。你最好有这样的东西......

SELECT DISTINCT T1.id, T1.name
FROM (SELECT id, name, X AS trimmedName FROM Table1 ) AS T1
INNER JOIN Table2 AS T2
ON T1.id = T2.id
AND T2.textBlock LIKE concat('%', T1.trimmedName, '%')
;

带有前导通配符的 LIKE 仍然会给您带来性能障碍;但希望 id 相等条件将否定该问题。

--- 交替 ---我用得不多,但我看到人们使用 EXISTS 报告了很好的结果。像这样的……

SELECT T1.id, T1.name
FROM Table1 T1
WHERE EXISTS (
SELECT *
FROM Table2 T2
WHERE T2.id = t1.id AND T2.textBlock like concat('%', T1.name, '%')
)

关于mysql - 使用 MySql 用户变量的分歧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35490614/

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