如何基于其他两个表的左联接获取表的内容

时间:2019-02-19 10:11:58

标签: mysql sql

我有一个categories表和一个files表。有一个category_record_mm表用于存储关系。 我想要获取文件的类别,为此我写了JOIN语句,但是JOIn抱怨filesuid不是有效的列。我实际想要的是,如果category_record_mmforeign_uid等于某个id,它应该给我所有类别。 这是我写的:

SELECT * FROM `categories`
LEFT JOIN `category_record_mm` ON `category_record_mm`.`foreign_uid` = `files`.`uid`
WHERE (`category_record_mm`.`foreign_uid` = 123 )

2 个答案:

答案 0 :(得分:1)

您缺少1个JOIN,介于categoriescategory_record_mm之间的那个

这就像有三个城镇,ABC,在AB之间有一座桥梁,在{{1 }}和B。如果不使用CA之间的桥梁,就无法从CA

B

SELECT * FROM `categories` LEFT JOIN `category_record_mm` ON `category_record_mm`.`categories_uid` = `categories`.`uid` LEFT JOIN `files` ON `category_record_mm`.`foreign_uid` = `files`.`uid` WHERE (`category_record_mm`.`foreign_uid` = 123 ) 是引用表categories_uidcategories的外键。categoriesuid的主键

答案 1 :(得分:1)

如果只需要类别,则无需引用files表。您只需要正确表达查询语句即可:

SELECT c.*
FROM categories c JOIN
     category_record_mm cr
     ON cr.categories_uid = c.uid
WHERE cr.foreign_uid = 123;

注意:

  • 两个表之间的JOIN category 列上,而不是在 file 列上。
  • 表别名使查询的编写和读取更加容易。
  • 您在category_record_mm中有文件uid。您正在对此进行过滤,因此无需加入files表。