我四处寻找有关高效“相关视频”算法的信息,但我正在努力获得有序、准确的结果
我得到的“流派”是竖线分隔的字符串。例如:| Action |科幻|惊悚|
$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);
然后我基本上将其分解并根据流派数量进行手动、低效的流派匹配搜索。结果很差,会返回任何半相关的内容。
这段代码让我想吐!它有效,但我讨厌它,而且我知道它 super 蹩脚。有什么技巧可以改进 SQL 并获得更丰富的结果吗?
最佳答案
将流派到电影的映射移动到一个新表 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 注入(inject)。
额外的表也是一个好主意,因为您的数据库架构未规范化。特别是 Chris Date 的第四个条件 first normal form被侵犯:
Every row-and-column intersection contains exactly one value from the applicable domain (and nothing else).
关于php - 相关视频算法 MySql 使用 genre,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5794190/