我有一个mysql查询:
$query = "SELECT * FROM movielist WHERE genre = 'comedy' ORDER BY dateadded DESC";
我需要改变它,以便从流派中选择流派包含'喜剧'。
(注意:我的类型字段通常包含多个类型的例子“喜剧,动作,戏剧”。
答案 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
中获得很多好处