SQL JOIN提供双重结果

时间:2016-06-24 06:41:58

标签: mysql sql

我的数据库和SQL:

http://sqlfiddle.com/#!9/ebddb/1/0


问题:

name - 表

中的记录少于7条时,notchtype - 列中的错误数据会返回重复项

<小时/> 我的问题:

为什么它会返回重复项以及如何防止它?

<小时/> 预期结果:

这个小提琴显示了预期的结果:http://sqlfiddle.com/#!9/22660/1

在这个结果中,唯一比实际数据库和SQL更多的是notchtype - 表

中的2条记录

因此,idnotchidnumber列在返回的行中应该是唯一的。

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

结果:

Result

<小时/> 的解决!

LEFT JOIN = VARCHAR字段上的

BIGINT会导致奇怪的返回值。查看Piyush Gupta的答案和评论

2 个答案:

答案 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中执行缺口类型表的名称列。因此,您可以使用上述查询并在数据库中进行本地检查。我希望你能得到输出。

截图(使用MySQL Workbench) enter image description here

更新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