使用流派的相关视频算法MySql

时间:2011-04-26 17:33:52

标签: php mysql sql

我一直在寻找有效的“相关视频”算法的信息,但我很难获得有序的,准确的结果

我得到'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并获得更丰富结果的任何提示吗?

1 个答案:

答案 0 :(得分:1)

将类型的动画映射移动到包含movie_genresmovie列的新表格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的第四个条件被违反了:

  

每个行 - 列交集都只包含适用域中的一个值(没有别的)。