我在奇怪的情况下苦苦挣扎,两个宫殿的数据相同,但我的服务器有mariadb服务器版本10. *而我的开发服务器有mysql版本5. *
这是无法正常工作的查询
SELECT
t.sponsor_id,
@user_id
FROM
(
SELECT user_id, sponsor_id
FROM profiles
ORDER BY user_id DESC
) AS t ,
(select @user_id := 101 ) initialize
WHERE FIND_IN_SET(t.user_id, @user_id) > 0 AND
@user_id := concat(@user_id, ',', t.sponsor_id)
相同的查询会产生不同的结果集
这是开发服务器的输出
生产服务器的输出
sponsor_id | @user_id
-----------------------
101 | 101, 100
请帮我解决这个问题
答案 0 :(得分:1)
您需要修改逻辑以避免在同一查询中设置和阅读@user_id
。 MySQL manual和MariaDB documentation都明确警告此类查询不确定。
MySQL的:
作为一般规则,除了在SET语句中,你永远不应该 为用户变量赋值并读取其中的值 声明。 < ...>对于其他语句,例如SELECT,您可能会得到 你期望的结果,但这不能保证。
MariaDB的:
读取用户定义的变量并在其中设置其值是不安全的 相同的声明(除非命令是SET),因为这些顺序 行动未定义。
注意:如果你想说"但它在#34;之前一直对我有用,请再读一遍。它可能有效,但无法保证。
答案 1 :(得分:0)
消除所有@variables。专注于GROUP_CONCAT()
。
在不知道数据,架构或所需输出是什么的情况下,我只能猜测这样的事情可能有用:
SELECT sponsor_id
GROUP_CONCAT(user_id ORDER BY user_id) AS users
FROM profiles
ORDER BY sponsor_id;