MySQL不同的结果来自相同的查询/数据

时间:2017-03-29 16:05:59

标签: mysql correlated-subquery

我有两台运行MySQL的服务器。两者都在窗户上。一个是我当地的机器人(Windows 7,MySQL 5.6.25,32bit),另一个是我的生产网络服务器(Windows 2012,MySQL 5.7.11-log,64bit(显示变量显示给我的)。

两者之间的数据相同。我从Windows 7(使用MySQL Workbench)备份数据并在2012机器上恢复它。

我在两台机器上运行查询,但结果不一样。我有两个表,项目和项目说明,它们之间的关系是1:m,与projects.id到projectsnotes.idProject有关。每个笔记都标有日期(dComment)。查询的目标是仅检索项目信息和最新评论。

以下是查询:

select space(1) as cAction,
    p.id,
    p.iNum,
    p.cStatus,
    p.cName,
    p.cDesc,
    ifnull(pl.cNickName, 'UNASSIGNED') as cProjectLeader,
    IFNULL(concat (
            date_format(pn.dComment, '%Y-%m-%d'),
            ': ',
            pn.cComment
            ), '') as cComment,
    date_format(p.dRequested, '%Y-%m-%d') as dRequested,
    date_format(p.dRequired, '%Y-%m-%d') as dRequired,
    format(p.nPercentComplete, 2) as nPercentComplete,
    p.tLastUpdated,
    p.bCompleted,
    p.idProjectLeader
from projects p
left outer join projectleaders pl on p.idProjectLeader = pl.id
left outer join (
    select idProject,
        dComment,
        cComment
    from projectnotes
    order by dComment desc,
        tLastUpdated desc
    ) pn on p.id = pn.idProject
where p.cInstallCode = 'ITM'
    and cStatus in ('Pending', 'Active', 'On Hold', 'Completed', 'Cancelled')
    and bCompleted = 0
group by iNum
order by iNum;

现在,这是奇怪的部分。当我在Windows 7机器上运行时,我得到了正确的cComment值。具体做法是:

  

2017-03-28:来自笔记替换的文字

这是最新的说明。当我在2012服务器上运行它时:

  

2016-05-17:此笔记中的文字也被替换

如果我在2012服务器上单独运行子查询,我会得到正确的值(即,以相反的顺序列出所有注释。

哦,这个笔记既不是本项目笔记中的第一个也不是最后一个。

所以我真的很想知道发生了什么。对此有任何想法将不胜感激。

提前致谢。

2 个答案:

答案 0 :(得分:0)

这是预期的行为。

select ...
from projects p
left outer join projectleaders pl on p.idProjectLeader = pl.id
left outer join (...) pn on p.id = pn.idProject
where ...
group by iNum
order by iNum;

由于MySQL对GROUP BY的特殊处理,它不会报告此查询的错误。但是,您必须记住,由于您不使用聚合,并且GROUP BY将消除大量行,因此保留在最终结果集中的行由相当模糊的标准确定...

例如:

SELECT a,b FROM t GROUP BY a

将返回哪个b?在某些MySQL版本中,这将是表t中找到的b的第一个值。如果表t以某种方式排序,则可以利用它。但我肯定不相信这种行为在版本之间保持不变......另外,请记住MySQL可以自由更改你的连接顺序......

答案 1 :(得分:0)

行。我想我有一个解决方案。我没有使用连接来编写一个函数,而是返回了我需要的值,如下所示:

DROP FUNCTION if exists f_lastprojectnote;
DELIMITER $$

CREATE FUNCTION f_lastprojectnote(tidProject varchar(36))
RETURNS varchar(1000) DETERMINISTIC
BEGIN
    DECLARE cRetVal VARCHAR(1000);

    SELECT concat(date_format(pn.dComment, '%Y-%m-%d'), ': ', pn.cComment) INTO cRetVal
      FROM projectnotes pn
     WHERE idProject = tidProject
     ORDER BY dComment DESC, tLastUpdated DESC
     LIMIT 1;

    RETURN cRetVal;
END$$

DELIMITER ;

它有效......