从3个表中进行大查询

Pat*_*rns 0 mysql sql

我有三张桌子

profiles (id, name, deleted)
categories (id, name, deleted)
profiles_categories (id, profile_id, category_id, , deleted)
Run Code Online (Sandbox Code Playgroud)

我如何可以选择所有profilesname在类别?

我尝试这样的东西,但它不起作用......

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)

Tar*_*ryn 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
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)