我的数据库和 SQL:

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

name -table 中的记录少于 7 条时,它会返回重复项,在 notchtype -column 中有错误的数据

我的问题:

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

预期结果:

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

在这个结果中,唯一比我的实际数据库和 SQL 添加更多的是 notchtype -table 中的 2 条记录

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

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
    

    结果:

    mysql - SQL JOIN 给出双重结果-LMLPHP

    解决了!
    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)
    mysql - SQL JOIN 给出双重结果-LMLPHP

    更新 1 :这是一个奇怪的错误。我查看了数据库结构并找到了仅是数据类型问题的解决方案。您正在加入 bigint 和 varchar 数据类型,因此您需要更正数据类型。在这里,我将数据类型 bigint 更改为 varchar,用于 notchsize 表中的 notchsizeid 和 notchtype 表中的 notchtypeid。最后,您的预期输出即将到来。你可以 SEE OUTPUT HERE

    关于mysql - SQL JOIN 给出双重结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38007100/

    10-11 03:32