我一直在寻找有效的“相关视频”算法的信息,但我很难获得有序的,准确的结果
我得到'genre'作为管道分隔的字符串。例如:|行动|科幻|惊悚|
$genre = explode("|", $row['genre']);
if (count($genre) == 3) {
$sql = "SELECT title FROM `movie` WHERE genre LIKE '%$genre[1]%' LIMIT 0,8";
} else {
$sql = "SELECT title FROM `movie` WHERE (genre LIKE '%$genre[1]%' AND genre LIKE '%$genre[2]%') UNION SELECT title FROM `movie` WHERE (genre LIKE '%$genre[1]%' OR genre LIKE '%$genre[2]%') LIMIT 0,10";
}
$related = mysql_query($sql);
然后我基本上将它爆炸并根据流派计数对类型匹配进行手动,低效的搜索。结果很差,并返回任何半相关的内容。
这段代码让我想堵嘴!它有效,但我讨厌它,我知道它的超级跛脚。有关改进SQL并获得更丰富结果的任何提示吗?
答案 0 :(得分:1)
将类型的动画映射移动到包含movie_genres
和movie
列的新表格genre
。
这允许您这样做:
$genres = explode('|', trim($row['genre'], '|'));
$sql = "SELECT `movie`, COUNT(*) AS hits
FROM `movie_genres`
WHERE `genre` IN ('" . join("', '", $genres) . "')
GROUP BY `movie`
ORDER BY `hits` DESC
LIMIT 8";
但是,您必须确保阻止SQL注入。
额外的表也是一个好主意,因为您的数据库架构未规范化。特别是Chris Date的first normal form的第四个条件被违反了:
每个行 - 列交集都只包含适用域中的一个值(没有别的)。