在maria数据库服务器版本10和mysqli驱动程序上进行相同查询的结果不同

时间:2017-06-10 12:32:26

标签: mysql mariadb

我在奇怪的情况下苦苦挣扎,两个宫殿的数据相同,但我的服务器有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) 

相同的查询会产生不同的结果集

这是开发服务器的输出

Output of development serve

生产服务器的输出

   sponsor_id  | @user_id
   -----------------------
   101         |  101, 100

请帮我解决这个问题

2 个答案:

答案 0 :(得分:1)

您需要修改逻辑以避免在同一查询中设置和阅读@user_idMySQL manualMariaDB 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;