如何在一个高效的mysql查询中执行此任务?

如何在一个高效的mysql查询中执行此任务?,mysql,query-optimization,Mysql,Query Optimization,我有一个电视节目列表存储在一个表中。另一个表商店显示流派(动作,浪漫,喜剧) 大多数节目通常有一种以上的类型,因此没有一个单独的tv_类型栏目并将类型ID放入其中的选项 我可以创建一个查找表来存储电视节目id+流派id,并且我可以为与该节目相关的每个流派插入一行 当我想在索引上输出一个节目列表,以及与电视节目相关的流派名称时,事情变得模糊起来。如何将3个表绑定到一个高效的查询中(而不是为索引上的每个项运行单独的查询,获取其类型) 为了这篇文章的目的,表格如下 TV Show Table - tv

我有一个电视节目列表存储在一个表中。另一个表商店显示流派(动作,浪漫,喜剧)

大多数节目通常有一种以上的类型,因此没有一个单独的tv_类型栏目并将类型ID放入其中的选项

我可以创建一个查找表来存储电视节目id+流派id,并且我可以为与该节目相关的每个流派插入一行

当我想在索引上输出一个节目列表,以及与电视节目相关的流派名称时,事情变得模糊起来。如何将3个表绑定到一个高效的查询中(而不是为索引上的每个项运行单独的查询,获取其类型)

为了这篇文章的目的,表格如下

TV Show Table
- tv_id
- tv_name

Genre Table
- genre_id
- genre_name
谢谢

JOIN是SQL的核心。你会得到这样的结果

select tv_name, genre_name
from tvshows
   left join shows_genres on tvshows.tv_id = shows_genres.tv_id
   left join genres on genres.genre_id = shows_genres.genre_id

JOIN是SQL的核心。你会得到这样的结果

select tv_name, genre_name
from tvshows
   left join shows_genres on tvshows.tv_id = shows_genres.tv_id
   left join genres on genres.genre_id = shows_genres.genre_id

您可以使用MySQL的GROUP_CONCAT函数:

SELECT
    t.tv_name, GROUP_CONCAT(g.genre_name)
  FROM
    tv_shows t
    LEFT JOIN show_genres sg ON (t.tv_id = sg.tv_id)
    LEFT JOIN genres g ON (sg.genre_id = g.genre_id)
  WHERE
    /* whatever */
  GROUP BY t.tv_name

你的索引页面不会特别有效;不可能是这样的:你在拉整张桌子(好吧,三张桌子)。如果出现问题,请查看缓存。

您可以使用MySQL的GROUP_CONCAT函数:

SELECT
    t.tv_name, GROUP_CONCAT(g.genre_name)
  FROM
    tv_shows t
    LEFT JOIN show_genres sg ON (t.tv_id = sg.tv_id)
    LEFT JOIN genres g ON (sg.genre_id = g.genre_id)
  WHERE
    /* whatever */
  GROUP BY t.tv_name
你的索引页面不会特别有效;不可能是这样的:你在拉整张桌子(好吧,三张桌子)。如果出现问题,请查看缓存。

显示流派表 -rv_id int -类型id int

 select tv_show.name, genre.genre_name from tv_show,genre, show_genre where 
show_genre.tv_id = tv_show.tv_id and genre.genre_id=show_genre.genre_id
类似这样的内容显示流派表 -rv_id int -类型id int

 select tv_show.name, genre.genre_name from tv_show,genre, show_genre where 
show_genre.tv_id = tv_show.tv_id and genre.genre_id=show_genre.genre_id

类似这样的sql可能不是最好的sql,但我的想法是

select tv_name, genre_name
from tv_table, genre_table, lookup_table
where
    tv_table.tv_name = "superman"
    and
    tv_table.tv_id = lookup_table.tv_id
    and
    lookup_table.genre_id = genre_table.genre_id

可能不是最好的sql,但我的想法是

select tv_name, genre_name
from tv_table, genre_table, lookup_table
where
    tv_table.tv_name = "superman"
    and
    tv_table.tv_id = lookup_table.tv_id
    and
    lookup_table.genre_id = genre_table.genre_id


你确定这就是整个桌子的结构?因为两者之间没有关系。@orlandu63:他在问题中提到另一个表(他称之为查找表)来连接这两个表。你确定这就是整个表结构吗?因为这两者之间没有关系。@orlandu63:他在问题中提到了另一个表格(他称之为查找表)来连接这两个表格。如果没有任何类型,你会看到一个节目消失;您可能需要左连接。@derobert:说得好。在这里,编辑我的答案或投票支持你的答案是什么呢?事实上,我想不管怎么说,这个团体是值得投票的:)这只会在每个节目只有一种类型的情况下起作用。。。。你如何让它显示多个流派?如果没有任何流派,你会以一个节目消失而告终;您可能需要左连接。@derobert:说得好。在这里,编辑我的答案或投票支持你的答案是什么呢?事实上,我想不管怎么说,这个团体是值得投票的:)这只会在每个节目只有一种类型的情况下起作用。。。。你是如何让它展示多种风格的?我就是这样做的。。。这会给我造成负载问题。Remvoing group_concat语句将执行时间从1秒缩短到0.1。替代方法是不执行group_concat,而是在应用程序中执行(每个show/genre对将返回一行)。或者,缓存它。一个索引完全是最新的有多重要,一个小时可以吗?缓存将很难实现,因为大约有7种排序方法,大约有1200页的内容。我就是这样做的。。。这会给我造成负载问题。Remvoing group_concat语句将执行时间从1秒缩短到0.1。替代方法是不执行group_concat,而是在应用程序中执行(每个show/genre对将返回一行)。或者,缓存它。一个索引完全是最新的有多重要,1小时的时间可以吗?缓存将很难实现,因为大约有7种排序方法,大约有1200页的内容。