让我们假设下表:
-- 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
我尝试了左连接
,例如
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%'
但不知何故,它返回多个相同的寄存器记录,但 MainCat 描述错误。我现在感觉很蠢:P
注意:类别(主类别和子类别)的所有 ID 和描述都是 100% 唯一的。这也是原始数据库的简化版,但具有相同的目的。
所以我的问题是:
- 我的 SQL 编写正确吗?
- 如果是:奇怪(重复)结果可能是什么问题
- 如果不是:实现这一目标的正确方法是什么
附言DISTINCT
不起作用,因为它返回(错误)不同的 MainCat.descr
,因此没有 100% 重复
最佳答案
根据示例中的数据,此基于内部联接的查询应显示预期结果
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 个表之间的关系正确,因此您应该使用内联接
关于mysql - SQL 连接表以获取其他表数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38002696/