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

标签 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

我尝试了左连接,例如

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/

相关文章:

mysql - 如何计算文本文件中SQL语句的数量?

php - "insert ... on duplicate key update"查询适用于 phpmyadmin 但不适用于 PDO

mysql - 如何通过 shell/终端将 50MB 压缩 xml 文件(带有命名空间和完整大小 600MB)上传到 mysql 表中

mysql - 将 SQL 结果与逗号分隔符结合起来

mysql - 将 bigint 转换为天数

MySQL 显示可能的重复项

mysql - R 到 MySQL 查询

PHP 在我的 html 范围之外回显打印

c# - 使用 C# 从数据集中更新 Sql 表

php - 如何解决: session_start(): Cannot send session cache limiter - headers already sent