我有这三个表的电影,类别和关系,如下所示。
movies--
-----------------------
id|name|duration|
1 |x |5 mins |
2 |y |10 mins |
----------------------
category--
-----------------------
id|type |value |
1 |genre |action |
2 |language|english |
3 |genre |thriller |
4 |language|spanish |
------------------------
relationship--
id| movie_id|category_id|
1 |1 | 2 |
2 |1 | 3 |
------------------------------
我想要一个查询,可以在一个查询中获取电影的类型和语言。
以下是预期产出。
name|duration|language|genre |
x |5 mins |english |thriller|
--------------------------------
简而言之,我想两次使用type列。
请帮忙
答案 0 :(得分:1)
第1步:将所有三个表连接在一起。现在您可以获得每部电影的所有类别信息。
第2步:从大组合表中选择您想要的内容。
第3步:使用两个子查询来满足language
和genre
的特殊需求。
第4步:添加LIMIT 1
以避免冗余记录。
最终查询可能是这样的:
SELECT name, duration, (SELECT value FROM t WHERE type = 'language' AND name = 'x') AS language, (SELECT value FROM t WHERE type = 'genre' AND name = 'x') AS genre
FROM
(
SELECT m.name, m.duration, c.type FROM movies AS m
JOIN relationship AS r ON m.id = r.movie_id
JOIN category AS c ON r.category_id = c.id
) AS t LIMIT 1;
注意:
WHERE
子句的查询条件。 答案 1 :(得分:1)
你需要mysql数据透视表。这是将一些列转换为行数据。以下查询将生成您想要的内容:
SELECT
m.name,
m.duration,
MAX(IF(c.type = 'language', c.value, NULL)) AS language,
MAX(IF(c.type = 'genre', c.value, NULL)) AS genre
FROM movies AS m
INNER JOIN relationship AS r ON m.id = r.movie_id
INNER JOIN category AS c ON r.category_id = c.id
WHERE m.name = 'x'
GROUP BY m.name;
这会产生:
| name | duration | language | genre |
| x | 5 mins | english | thriller |
参见 DEMO
答案 2 :(得分:0)
一种方法使用两个连接,每种类型一个:
select m.*, cl.value as language, cg.language as genre
from movies m join
relationships r
on m.id = r.movie_id left join
categories cl
on cl.id = r.category_id and type = 'language' left join
categories cg
on cg.id = r.category_id and type = 'genre';
请注意,电影通常只有一种语言,但它们可以有多种类型。如果是这种情况,您将为每种类型获得一个单独的行。