从3个表中进行大查询

时间:2013-06-28 20:57:03

标签: mysql sql

我有三张桌子

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

3 个答案:

答案 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'