如何显示包含特定数据的字段的mysql查询结果?

时间:2010-03-26 19:58:47

标签: php mysql

我有一个mysql查询:

$query = "SELECT * FROM movielist WHERE genre = 'comedy' ORDER BY dateadded DESC";

我需要改变它,以便从流派中选择流派包含'喜剧'。

(注意:我的类型字段通常包含多个类型的例子“喜剧,动作,戏剧”。

4 个答案:

答案 0 :(得分:1)

您需要LIKE类型:

$query = "SELECT * FROM movielist WHERE genre LIKE '%comedy%' ORDER BY dateadded DESC"

答案 1 :(得分:1)

$query = "SELECT * FROM movielist WHERE genre LIKE '%comedy%' ORDER BY dateadded DESC";

OR

$query = "SELECT * FROM movielist WHERE FIND_IN_SET('comedy', genre) ORDER BY dateadded DESC";

在大多数情况下,第二个更好。

更好的是,您应该使用单独的表来促进多对多关系。

即。名为'movies_genres'的新表有两个字段 - movie_id和genre_id(两个索引的外键)。每次向电影或新电影添加新类型时,请在此表格中添加条目。

查找属于特定类型的所有电影:

SELECT movies.*
FROM movies
    JOIN movies_genres
        ON movies_genres.movie_id = movies.id
    JOIN genres
        ON movies_genres.genre_id = genres.id
WHERE genres.name = 'comedy'

查找属于特定电影的所有类型:

SELECT genres.*
FROM genres
    JOIN movies_genres
        ON movies_genres.genre_id = genres.id
    JOIN topics
        ON movies_genres.movie_id = movies.id
WHERE movies.name = 'Citizen Kane'

答案 2 :(得分:1)

使用您的架构,您可能会对find_in_set()

感兴趣
SELECT
  x,y,z
FROM
  movielist
WHERE
  find_in_list('comedy', genre)

请注意,这不是index-friendly,可能会很慢。


使用normalized tables,你不会有genre='comedy, action, drama'(即一个字段内的结构化数据),而是一张表

genres (
  id int auto_increment,
  genre_name varchar(...)
  ...
)

movielist (
  id int auto_increment,
  title varchar(...)
  ...
)

和一个表

moviegenres (
  movieid int,
  genreid int,
  ...
)

使用一个或两个JOINs将这三个表中存储的信息“粘合”在一起的查询。

答案 3 :(得分:0)

要立即解决,建议使用Dexter。但从长远来看,你会从normalizing your database

中获得很多好处