如何选择hasMany关系作为列名

我有2张桌子。

  1. 电影
  2. movie_meta

电影桌

| id | name         |
---------------------
| 1 | Harry Potter  |
| 2 | Joker         |
| 3 | Need For Speed|

movie_meta

| id | movie_id | key     | value            |
---------------------------------------------
| 1  | 1        | country | USA              |
| 2  | 1        | genre   | Horror & Sci-Fi  |
| 3  | 1        | actor   | Daniel Radcliffe |

我想要达到的目标是这样的。

| id | name         | country | genre           | actor            |
--------------------------------------------------------------------
| 1  | Harry Potter | USA     | Horror & Sci-Fi | Daniel Radcliffe |

movie_meta表的行数不受限制。那么,如何选择? 谢谢

fandly_jw 回答:如何选择hasMany关系作为列名

您可以三次加入movie_meta

select 
    m.*,c.value country,g.value genre,a.value actor
from movie m
inner join movie_meta c on c.movie_id = m.id and c.key = 'country'
inner join movie_meta g on g.movie_id = m.id and g.key = 'genre'
inner join movie_meta a on a.movie_id = m.id and a.key = 'actor'

为了提高性能,您希望在movie_meta(movie_id,key)上建立索引。

如果元表有可能缺少该属性之一,则可以将inner join转换为left join

或者您可以进行条件聚合(这比较整洁,但效率可能较低):

select 
    m.id,m.name,max(case when x.key = 'country' then value end) country,max(case when x.key = 'genre' then value end) genre,max(case when x.key = 'actor' then value end) actor
from movie m
inner join movie_meta x on x.movie_id = m.id
group by m.id,m.name
,

一种方法使用条件聚合。另一个使用多个join。在此示例中,两者的性能可能相似:

select m.*,mmc.value as country,mmg.value as genre,mma.value as actor
from movies m left join
     movie_meta mmc
     on mmc.movie_id = m.id = and mmc.key = 'country' left join
     movie_meta mma
     on mma.movie_id = m.id = and mma.key = 'actor' left join
     movie_meta mmg
     on mmg.movie_id = m.id = and mmg.key = 'genre' ;

请注意,您的示例每个电影只有一个演员和类型。在现实世界中,这两个都可能有多个值。

本文链接:https://www.f2er.com/3036448.html

大家都在问