使用mysql选择相同的列两次具有不同的单个id值

时间:2018-02-03 13:52:34

标签: mysql sql

我有这三个表的电影,类别和关系,如下所示。

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列。

请帮忙

3 个答案:

答案 0 :(得分:1)

  • 第1步:将所有三个表连接在一起。现在您可以获得每部电影的所有类别信息。

  • 第2步:从大组合表中选择您想要的内容。

  • 第3步:使用两个子查询来满足languagegenre的特殊需求。

  • 第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;

注意:

  1. 替换WHERE子句的查询条件。
  2. 此查询可能不是严格的语法正确。请自己解决。

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

请注意,电影通常只有一种语言,但它们可以有多种类型。如果是这种情况,您将为每种类型获得一个单独的行。