mysql IS NULL / LIKE %%条件

时间:2013-06-28 23:20:35

标签: php mysql

我正在处理一个给我带来困难的查询。

基本上,我的数据库race中有一个包含动态值的列(这些示例不是真正的内容,但代码是相同的。)

比赛可以为NULL(不需要特定比赛) 或种族可以持有一个或多个值(“人类,蜥蜴,狗”等)

我的查询是:

$var = $db->Query('SELECT * FROM table WHERE race LIKE "%'.$specie.'%" OR race IS NULL');

但是,这不起作用。此语句的流程中是否存在错误,使查询不返回任何内容? (显示默认的“空结果”)

编辑:在英语中我想让我的查询说“如果找到特定的种族,或者根本没有种族要求,则选择所有数据”(null)“

3 个答案:

答案 0 :(得分:1)

我认为你应该尝试交换引号:

$var = $db->Query("SELECT * FROM table WHERE race LIKE '%".$specie."%' OR race IS NULL");

至少,这是我要测试的东西,虽然我现在明白这不应该有所作为。

答案 1 :(得分:1)

也许您对FIND_IN_SET()感兴趣,因为您的可能值以逗号分隔存储:

$var = $db->Query('SELECT * 
                   FROM table 
                   WHERE 
                       FIND_IN_SET("' . $specie . '", race)
                       OR race IS NULL
                  ');

标准备注适用于此:

  • 不信任用户输入。始终使用prepared statements来处理输入变量。 SQL injection很糟糕!
  • 优化您的数据库以获得性能并更精确地制定查询! race可以在自己的表中,在它们之间使用N:M关系。

答案 2 :(得分:0)

您可以规范化您的设计并引入单独的specie_setsspecie_set_values

specie_sets:
    set_id (PK)

specie_set_values:
    set_id (FK) | value (INDEX)

您的table将包含对specie_sets(FK)的可空引用。

然后使用union:

(SELECT table.* 
    FROM specie_set_values 
    JOIN table ON specie_set_id = set_id
    WHERE value = :specie)
UNION
(SELECT * FROM table WHERE specie_set_id IS NULL)