代码之家  ›  专栏  ›  技术社区  ›  GROVER. sms

sql IN子句仅返回当前行,而不是所选行

  •  0
  • GROVER. sms  · 技术社区  · 7 年前

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

    . 例如,如果您选择了一部分级为的电影 R 文科硕士 M 文科硕士 R ).

    SQL

    $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 , 文科硕士 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 回复  |  直到 7 年前
        1
  •  1
  •   Barmar    7 年前

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

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

    When to use single quotes, double quotes, and backticks in MySQL

        2
  •  1
  •   Ravinder Reddy    7 年前

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

    改变

    $rating = "M, MA, R";
    

    :

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

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

        3
  •  0
  •   GROVER. sms    7 年前

    如果您正在使用 ,添加引号( ' )在每个元素之间。例如:

    IN(M, MA, R)
    

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