我有三张桌子
profiles (id, name, deleted)
categories (id, name, deleted)
profiles_categories (id, profile_id, category_id, , deleted)
如何在类别中选择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
由于
编辑
SELECT *
FROM profiles p
INNER JOIN profiles_categories pc
ON p.id = pc.profile_id
INNER JOIN categories c
ON pc.id = c.id
仅返回一个profile
(现在只有两个有效profiles
,但只有第一个有categories
)
答案 0 :(得分:6)
您当前的查询存在多个问题。
首先,您要混合连接类型。您应该在所有表之间使用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
表之间的INNER JOIN将返回所有表中存在的所有行。
请注意,根据您的表结构,您可以使用以下命令返回profiles_categories
表中具有相应行的配置文件:
select p.name
from profiles p
where p.id in (select profile_id
from profiles_categories);
编辑您想要返回所有配置文件,无论是否有类别,那么您需要使用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
答案 1 :(得分:2)
SELECT *
FROM profiles p
JOIN profiles_categories pc on p.id = pc.profile_id
JOIN categories c on pc.id = c.category_id
或
SELECT *
FROM profiles p, categories c, profiles_categories pc
WHERE p.id = pc.profile_id
AND pc.id = c.category_id
答案 2 :(得分:1)
试试这个:
SELECT *
FROM profiles p
JOIN profiles_categories pr on p.id = pr.profile_id
JOIN categories c on pr.id = c.category_id
WHERE c.name='thename'