0

我有三张桌子

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(现在只有两个 active profiles,但只有第一个categories

4

3 回答 3

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
于 2013-06-28T21:00:31.303 回答
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
于 2013-06-28T20:59:15.773 回答
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'
于 2013-06-28T21:01:25.603 回答