我有三张桌子
profiles (id, name, deleted)
categories (id, name, deleted)
profiles_categories (id, profile_id, category_id, , deleted)
Run Code Online (Sandbox Code Playgroud)
我如何可以选择所有profiles与name在类别?
我尝试这样的东西,但它不起作用......
SELECT *
FROM profiles p
JOIN categories c, profiles_categories pc
WHERE p.id = pc.profile_id
AND WHERE pc.id = c.category_id
Run Code Online (Sandbox Code Playgroud)
谢谢
编辑
SELECT *
FROM profiles p
INNER JOIN profiles_categories pc
ON p.id = pc.profile_id
INNER JOIN categories c
ON pc.id = c.id
Run Code Online (Sandbox Code Playgroud)
它仅返回一个profile(现在只有两个活动profiles,但只有第一个categories)
您当前的查询有几个问题.
首先,您要混合连接类型.您应该在所有表之间使用ANSI JOIN语法.不要将ANSI JOIN语法与某些表混合,然后在其他表之间使用逗号.
其次,你有两个WHERE子句,你只能有一个WHERE子句.
最后,您应该包括要返回的列名而不是 SELECT *
查询应该类似于:
SELECT p.name, c.name
FROM profiles p
INNER JOIN profiles_categories pc
ON p.id = pc.profile_id
INNER JOIN categories c
ON pc.id = c.category_id
Run Code Online (Sandbox Code Playgroud)
表之间的INNER JOIN将返回所有表中存在的所有行.
请注意,根据您的表结构,您可以使用以下命令返回表中具有相应行的配置文件profiles_categories:
select p.name
from profiles p
where p.id in (select profile_id
from profiles_categories);
Run Code Online (Sandbox Code Playgroud)
编辑您想要返回所有配置文件,无论是否有类别,然后您需要使用LEFT JOIN:
SELECT p.name, c.name
FROM profiles p
LEFT JOIN profiles_categories pc
ON p.id = pc.profile_id
LEFT JOIN categories c
ON pc.id = c.category_id
Run Code Online (Sandbox Code Playgroud)