1

我正在处理一个让我很难过的查询。

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

种族可以为 NULL(不需要特定种族)或种族可以包含 1 个或多个值(“人类、蜥蜴、狗”等)

我的查询是:

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

但是,这是行不通的。该语句的流程中是否有错误会使查询不返回任何内容?(显示默认的“空结果”)

编辑:用英语,我希望我的查询说“如果找到特定种族,或者根本没有种族要求(空),请选择所有数据”

4

3 回答 3

1

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

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

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

于 2013-06-28T23:24:28.387 回答
1

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

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

标准注释在这里适用:

  • 不要相信用户输入。始终使用准备好的语句来处理输入变量。SQL注入不好!
  • 优化您的数据库以获得性能并更精确地制定查询!种族可以在自己的表中,N:M在其间使用关系。
于 2013-06-29T00:54:44.680 回答
0

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

specie_sets:
    set_id (PK)

specie_set_values:
    set_id (FK) | value (INDEX)

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

然后使用联合:

(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)
于 2013-06-29T01:09:13.670 回答