Mysql sql联接返回具有空值的字段

Mysql sql联接返回具有空值的字段,mysql,sql,join,Mysql,Sql,Join,我有以下疑问: SELECT * FROM tableA.A LEFT JOIN tableB AS B ON B.id=A.id LEFT JOIN tableC AS C ON C.id=A.id2 LEFT JOIN tableD AS D ON D.id=A.id3 WHERE D.id = '124' AND A.field = 1 GROUP BY A.id ORDER BY D.sortorder 上面的结构与我的实际查询相同,我想指出的是,我在查询中使用的所有表都是有

我有以下疑问:

SELECT *
FROM tableA.A 
LEFT JOIN tableB AS B ON B.id=A.id 
LEFT JOIN tableC AS C ON C.id=A.id2 
LEFT JOIN tableD AS D ON D.id=A.id3 
WHERE D.id = '124' AND A.field = 1 
GROUP BY A.id ORDER BY D.sortorder
上面的结构与我的实际查询相同,我想指出的是,我在查询中使用的所有表都是有效的,行中填充了数字和字母字符。任何地方都没有空值。

问题是,在我执行这个查询之后,它返回一些带有NULL值的字段,即使它们不是NULL

我尽力解释,但这是一种奇怪的行为,我在谷歌上找不到任何东西

如果这不是一个常见的问题,并且很难找到错误,也许一些建议可以帮助我找到错误

先谢谢你

更新我想道歉。问题是由表A末尾的enter键引起的,这就是它返回NULL的原因,因为实际上没有匹配项。感谢您的帮助

尝试此查询:

SELECT *
FROM tableA.A 
LEFT JOIN tableB AS B ON B.id=A.id 
LEFT JOIN tableC AS C ON C.id=A.id2 
LEFT JOIN tableD AS D ON D.id=A.id3 and D.id = '124'
WHERE A.field = 1 
GROUP BY A.id
ORDER BY COALESCE(D.sortorder,0)
LEFT JOIN
右表中的条件应放在
on
子句中,而不是
WHERE
子句中


如果这也不起作用,那么我想你误解了左连接的目的。它用于保存主表中的所有记录(在您的情况下为A),并丢弃细节表中不匹配的所有数据,因此,当不匹配fouhd时,将出现
NULL
值。

如果我这样更改,则正确的表条件不起作用。当您将条件放在
位置而不是
上时,联接将变成
内部联接。您可以使用另一个select包装查询,然后对其进行筛选。是的,我知道,但在D表上,我得到了一些字段,这些字段通过id和A表中的一些字段相匹配,我正在使用另一个字段来提取一些匹配的字段,这就是D.id=124的目的。但是它不会返回我需要的内容,因为一些返回的字段在不应该返回的时候有空值。在D表中,这些值具有值124,然后将其从
上的
中删除,将查询->
SELECT*from(query)s包装,其中s.D_id='124'
永远不要使用
SELECT*
groupby
。这表明您不知道自己在做什么。@GordonLinoff,在我的代码中,我使用了一些特定字段,其中一些字段具有相同的名称,这就是group的用途by@PeterCos-这样读很让人困惑,因为在编写时,您的查询会抛出一个错误。如果您输入一些列名以及如何对它们进行分组,对我们来说会更容易,否则您编写的查询没有问题。如果表B、C和D中有匹配的id,那么就不应该有空值。出现空值的唯一原因是表A id在表B、C或D中找不到匹配的id。我建议查看从其他表之一返回空值的特定A.id,然后进入并验证那里确实有匹配的id