Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL来自同一查询/数据的不同结果_Mysql_Correlated Subquery - Fatal编程技术网

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

MySQL来自同一查询/数据的不同结果,mysql,correlated-subquery,Mysql,Correlated Subquery,我有两台运行MySQL的服务器。两者都在windows上。一个是我的本地machime(Windows 7,MySQL 5.6.25,32位),另一个是我的生产Web服务器(Windows 2012,MySQL 5.7.11-log,64位)(这就是show variables向我展示的内容) 数据在两者之间是相同的。我从Windows7(使用MySQL工作台)备份了数据,并在2012机器上还原了它 我正在两台计算机上运行查询,但得到的结果不同。我有两个表,projects和projectsno

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

数据在两者之间是相同的。我从Windows7(使用MySQL工作台)备份了数据,并在2012机器上还原了它

我正在两台计算机上运行查询,但得到的结果不同。我有两个表,projects和projectsnotes,它们之间的关系为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服务器上单独运行子查询,我会得到正确的值(即,所有注释的列表,顺序相反)

哦,这张便条既不是这个项目的第一张,也不是最后一张

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


提前感谢。

这是预期的行为

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 ;

它工作…

好的。在这种情况下,我将如何完成此行为?由于注释的排序可能很慢,我会在项目表中添加最后一个注释id字段,每次添加/修改注释时都会更新该字段……或者或多或少地像上面发布的那样进行操作。除非有理由删除分组依据,否则应将其删除我在那儿。