sql IN子句只返回当前行,而不是选定的行

时间:2017-09-22 05:15:32

标签: php mysql sql

我正在开发一个网站,该网站应该通过比较所选电影中的元数据和数据库中的元数据来返回类似的电影。

目前,我只是比较分类评级。例如,如果您选择的评级为 R MA 的电影,则返回的结果应该是具有类似分类的结果(即: M MA - [R 的)。

到目前为止,这是我的 SQL PHP 的样子。

$rating = $data->rating;
if($rating === "MA" || $rating === "R"){
    $rating = "M, MA, R";
}

$rating = "rating IN (" . $rating . ")";
$sql = "SELECT * FROM movies WHERE unique_id <> ? AND " . $rating . " LIMIT 10";

如果 SQL 输出到页面,它应该看起来像SELECT * ... AND rating IN (M, MA, R) ...。但是,所有那些评级为 M MA 或<的电影都不会返回结果em> R (不包括所选电影),它只会返回所选的电影。

这是我当前数据库表的示例

+----+--------+--------+-----------+
| id | title  | rating | unique_id |
+----+--------+--------+-----------+
|  1 | movieA | R      | idA       |
|  2 | movieB | MA     | idB       |
|  3 | movieC | M      | idC       |
|  4 | movieD | MA     | idD       |
|  5 | movieE | PG     | idE       |
+----+--------+--------+-----------+

对于movieA,它应该返回movieE以外的所有电影。如果是movieC,则应该返回2, 4 and 5

我觉得我已经正确地使用了IN条款,所以我很困惑为什么这不起作用。

所有帮助表示赞赏,干杯。

3 个答案:

答案 0 :(得分:1)

由于评级是字符串,因此需要引用它们。

if($rating === "MA" || $rating === "R"){
    $rating = "'M', 'MA', 'R'";
} else {
    $rating = "'$rating'";
}

请参阅When to use single quotes, double quotes, and backticks in MySQL

答案 1 :(得分:1)

如果rating列的类型为varchar,则必须在每个搜索字符串上包围单引号。

更改

$rating = "M, MA, R";

$rating = "'M', 'MA', 'R'";

结果查询如下所示:

SELECT * FROM movies 
 WHERE unique_id <> ? 
   AND rating IN ('M', 'MA', 'R')
 LIMIT 10

应用它,你应该得到预期的结果。

答案 2 :(得分:0)

如果您使用字符串而不是整数,请在每个元素之间添加引号(')。例如:

IN(M, MA, R)

然后会变成:

IN('M','MA','R')