SQL连接表以获取其他表数据

时间:2016-06-23 22:07:42

标签: mysql sql

让我们假设下表:

-- Register
regid       descr               mainid      subid
  1         Registration #1     1           1
  2         Registration #2     2           3
  3         Registration #3     1           4
  4         Registration #4     2           2

-- MainCat
mainid      descr
  1         MainCat.1
  2         MainCat.2

-- SubCat
subid       descr
  1         SubCat.1
  2         SubCat.2
  3         SubCat.3
  4         SubCat.4

如何得到这样的结果:

- Description: -     - MainCat -    - SubCat -
 Registration #1      MainCat.1      SubCat.1
 Registration #2      MainCat.2      SubCat.3
 Registration #3      MainCat.1      SubCat.4
 Registration #4      MainCat.2      SubCat.2

我尝试了left join之类的

SELECT 
    Register.*,
    MainCat.descr AS MainCat,
    SubCat.descr AS SubCat
FROM
    Register
LEFT JOIN 
    MainCat ON
    Register.mainid = MainCat.mainid
LEFT JOIN
    SubCat ON
    Register.subid = SubCat.subid
WHERE
    Register.descr LIKE 'Registration%'

但不知何故,它会返回多个相同的Register-records,并使用错误的MainCat描述。我现在感觉真的很蠢:P

注意:所有ID和类别(主要和子)的描述都是100%唯一的。这也是原始的简化数据库,但它有相同的目的。

所以我的问题是:

  • 我是否正确编写了我的SQL?
  • 如果是:可能是奇怪(重复)结果的问题
  • 如果否:实现此目的的正确方法是什么

P.S。 DISTINCT确实有效,因为它返回(错误)不同MainCat.descr,因此没有100%重复

4 个答案:

答案 0 :(得分:1)

根据示例中的数据,此查询基于内部联接应显示已删除的结果

       SELECT 
        Register.*,
        MainCat.descr AS MainCat,
        SubCat.descr AS SubCat
    FROM Register
    INNER JOIN  MainCat ON  Register.mainid = MainCat.mainid
    INNER JOIN  SubCat ON   Register.subid = SubCat.subid
    WHERE  Register.descr LIKE 'Registration%'

当并非所有相关列都包含有效数据时,左连接很有用..在您的情况下,您在3个表之间有正确的实现,因此您应该使用内连接

答案 1 :(得分:1)

查询中唯一缺少的是FROM子句。当我添加它时,它按预期工作:http://sqlfiddle.com/#!9/41450/1/0

答案 2 :(得分:0)

选择DISTINCT,这应该为您的左连接提供唯一的行正确

答案 3 :(得分:0)

SELECT
    R.descr  AS Description,
    MC.descr AS MainCat,
    SB.descr AS SubCat
FROM
    Register AS R
LEFT JOIN
    MainCat MC ON
    R.mainid = MC.mainid
LEFT JOIN
    SubCat SC ON
    R.subid = SC.subid