我的数据库和SQL:
http://sqlfiddle.com/#!9/ebddb/1/0
当name
- 表
notchtype
- 列中的错误数据会返回重复项
<小时/> 我的问题:
为什么它会返回重复项以及如何防止它?
<小时/> 预期结果:
这个小提琴显示了预期的结果:http://sqlfiddle.com/#!9/22660/1
在这个结果中,唯一比实际数据库和SQL更多的是notchtype
- 表
因此,id
,notchid
和number
列在返回的行中应该是唯一的。
Piyush Gupta答案中的截图显示了正确的预期结果。关于SQL小提琴和本地MariaDB版本10.1.9的相同查询返回不同的
<小时/> 注意:
notchtype
表中至少有7条记录时,突然间没有重复记录,问题就解决了。null
值确实应为null
。size
- 列实际上正在返回正确的值,尽管LEFT JOIN
或多或少相同notches.notchdescr
&#39;中的ID连接&#39;使用notchtype.notchtypeid
列中的ID并作为小提琴中的name
列返回notches.notchsize
&#39;中的ID连接&#39;使用notchsize.notchsizeid
列中的ID并作为小提琴中的size
列返回<小时/> 不工作:
INNER JOIN
,不知道为什么DISTINCT
,因为name
- 列的值不同,所以没有确切的重复GROUP BY
,因为它会返回name
- 列<小时/> 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的答案和评论
答案 0 :(得分:4)
您错过了查询中的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中执行缺口类型表的名称列。因此,您可以使用上述查询并在数据库中进行本地检查。我希望你能得到输出。
更新1 :这是奇怪的错误。我查看了数据库结构,发现只有数据类型问题的解决方案。您正在加入bigint和varchar数据类型,因此您需要更正数据类型。这里我将数据类型bigint更改为varchar,用于notchsize表中的notchsizeid和notchtype表中的notchtypeid。最后,您的预期输出即将到来。你可以SEE OUTPUT HERE。
答案 1 :(得分:0)
您可以使用分组来完成。但是你需要告诉你的逻辑。
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 id
ORDER BY notches.number ASC