如何在1个单独,高效的mysql查询中执行此任务?

时间:2009-07-24 01:06:06

标签: mysql query-optimization

我有一个存储在1个表格中的电视节目列表。另一张桌子展示了流派(动作,浪漫,喜剧)。

大多数节目通常都有超过1种类型,所以只有一个tv_genre列并将类型ID放在那里就没有选择。

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

当我想要输出模糊的东西时,我想输出索引上的节目列表,以及与电视节目相关的流派名称。如何将3个表组合成1个有效的查询(而不是为索引上的每个项运行单独的查询,获取其类型)。

就本文而言,表格如下

TV Show Table
- tv_id
- tv_name

Genre Table
- genre_id
- genre_name

谢谢!

4 个答案:

答案 0 :(得分:6)

http://dev.mysql.com/doc/refman/5.0/en/join.html

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

答案 1 :(得分:4)

您可以使用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

您的索引页面效率不高;它不能是:你拉整个桌子(好吧,所有三个桌子)。如果它成为一个问题,请查看缓存。

答案 2 :(得分:0)

Show-Genre表   - rv_id int   - genre_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

像这样的东西

答案 3 :(得分:0)

可能不是最好的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