php - 相关视频算法 MySql 使用 genre

标签 php mysql sql

我四处寻找有关高效“相关视频”算法的信息,但我正在努力获得有序、准确的结果

我得到的“流派”是竖线分隔的字符串。例如:| 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 中,其中包含列 moviegenre

这允许您这样做:

$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/

相关文章:

php - 准备好的语句不适用于 ALTER 表查询

php - 在哪里可以找到 double dollar PHP 语法的引用资料?

php - 删除时的两个确认对话框

php - AJAX 加载从 onclick 调用的 php 脚本时出现问题;

php - 当回显 html 标签时,输出会打印出所有内容

MySql LOAD_FILE 奇怪的权限问题?

MYSQL - 语法错误,意外 '@',期待 $end

sql - 快速 SQL 问题!按出现次数最多的属性排序

php - 从数据库获取子类别数据到列表

mysql 将组内的订单保存到子表