我的数据库和 SQL:
http://sqlfiddle.com/#!9/ebddb/1/0
问题:
当 name
-table 中的记录少于 7 条时,它会返回重复项,在 notchtype
-column 中有错误的数据
我的问题:
为什么它返回重复项以及如何防止它?
预期结果:
这个 fiddle 显示了预期的结果:http://sqlfiddle.com/#!9/22660/1
在这个结果中,唯一比我的实际数据库和 SQL 添加更多的是 notchtype
-table 中的 2 条记录
因此 id
、 notchid
和 number
列在返回的行中应该是唯一的。
Piyush Gupta 答案中的屏幕截图显示了正确的预期结果。 SQL fiddle 和 MariaDB 版本 10.1.9 本地的相同查询返回不同的内容
注释:
notchtype
表中至少有 7 条记录时,突然不再有重复项,问题就“解决了”。 null
值确实应该是 null
。 size
-column 实际上返回了正确的值,尽管 LEFT JOIN
或多或少与 notches.notchdescr
中的 ID 与 notchtype.notchtypeid
列中的 ID“连接”,并作为 fiddle name
列返回notches.notchsize
中的 ID 与 notchsize.notchsizeid
列中的 ID“连接”,并作为 fiddle size
列返回不工作:
INNER JOIN
,不知道为什么 DISTINCT
,因为 name
列有不同的值,所以没有完全重复的 GROUP BY
,因为它返回 name
-column 更新 Piyush Gupta 的回答/评论
在 MySQL 5.7 上执行的查询:
SELECT
notches.id,
notches.notchid,
notches.number,
notches.xcoord,
notches.ycoord,
notches.mapid,
notches.location,
notches.date,
notches.price,
notches.invoiced,
notchsize.size AS notchsize,
notchtype.name AS notchdescr
FROM
notches
LEFT JOIN
notchtype ON
notches.notchdescr = notchtype.notchtypeid
LEFT JOIN
notchsize ON
notches.notchsize = notchsize.notchsizeid
WHERE
notches.del = 0
AND
notches.projectid = '2016032411364363055'
GROUP BY notches.id, notches.notchid, notches.number
ORDER BY notches.number ASC
结果:
解决了!
LEFT JOIN
= VARCHAR
字段上的 BIGINT
会导致奇怪的返回值。查看 Piyush Gupta 的回答和评论 最佳答案
您在聚合数据的查询中错过了 GROUP BY
。所以你的查询将是,
SELECT
notches.id,
notches.notchid,
notches.number,
notches.xcoord,
notches.ycoord,
notches.mapid,
notches.location,
notches.descr,
notches.date,
notches.price,
notches.invoiced,
notchtype.name AS notchdescr,
notchsize.size AS notchsize
FROM
notches
LEFT JOIN
notchtype ON
notches.notchdescr = notchtype.notchtypeid
LEFT JOIN
notchsize ON
notches.notchsize = notchsize.notchsizeid
WHERE
notches.del = 0
AND
notches.projectid = '2016032411364363055'
GROUP BY notches.id,
notches.notchid,
notches.number
ORDER BY notches.number ASC;
输出: ONLINE DEMO HERE
注意: 我在本地导入了您的数据结构,并且得到了与您期望的相同的输出,但是在 SQLFiddle 中, notchtype.name AS notchdescr 列未在 SQLFiddle 中执行,该列仅显示了 nicktype 表的名称列。所以你可以使用上面的查询并在你的数据库中本地检查。我希望你会得到需要的输出。
截图(使用 MySQL Workbench)
更新 1 :这是一个奇怪的错误。我查看了数据库结构并找到了仅是数据类型问题的解决方案。您正在加入 bigint 和 varchar 数据类型,因此您需要更正数据类型。在这里,我将数据类型 bigint 更改为 varchar,用于 notchsize 表中的 notchsizeid 和 notchtype 表中的 notchtypeid。最后,您的预期输出即将到来。你可以 SEE OUTPUT HERE 。
关于mysql - SQL JOIN 给出双重结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38007100/