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



我有两台运行MySQL的服务器。两者都在窗户上。一个是我的本地机器(Windows 7,MySQL 5.6.25,32位),另一个是我的生产Web服务器(Windows 2012,MySQL 5.7.11-log,64位(这就是显示变量向我展示的内容)。

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

我在两台机器上运行查询,但得到不同的结果。我有两个表,项目和项目笔记,它们之间的关系为1:m,与projectsnotes.idProject projects.id 相关。每个注释都标有日期(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 服务器上单独运行子查询,我会得到正确的值(即,所有注释的列表以相反的顺序排列。

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

所以老实说,我想知道发生了什么。对此的任何想法将不胜感激。

提前谢谢。

这是预期行为。

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可以自由更改您的加入顺序...

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

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 ;

它有效...

相关内容

  • 没有找到相关文章

最新更新