2010-03-26 53 views

回答

1

您需要LIKE流派:

$query = "SELECT * FROM movielist WHERE genre LIKE '%comedy%' ORDER BY dateadded DESC" 
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"; 

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

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

即,具有两个字段(movie_id和genre_id(均为索引外键))的新表称为'movies_genres'。每次将新的流派添加到电影或将新电影添加到流派时,请向此表添加条目。

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

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' 
0

对于立即解决,做一个德克斯特建议。但是,从长远来看,你会得到很多的好处从normalizing your database

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将存储在这三个表中的信息“粘合”在一起的查询。