我正在处理一个给我带来困难的查询。
基本上,我在数据库race
中有一个列,它包含一个动态值(这些示例不是真正的交易内容,但代码是相同的)。
race可以为NULL(不需要特定的race)或种族可以持有一个或多个值("人类、蜥蜴、狗"等)
我的问题是:
$var = $db->Query('SELECT * FROM table WHERE race LIKE "%'.$specie.'%" OR race IS NULL');
然而,这并不奏效。该语句的流中是否存在将使查询不返回任何内容的错误?(显示默认的"空结果")
编辑:在英语中,我希望我的查询说"如果找到特定种族,或者如果根本没有种族要求(null),请选择所有数据"
也许您对FIND_IN_SET()
感兴趣,因为您可能的值以逗号分隔存储:
$var = $db->Query('SELECT *
FROM table
WHERE
FIND_IN_SET("' . $specie . '", race)
OR race IS NULL
');
此处适用标准备注:
- 不要相信用户输入。始终使用准备好的语句来处理输入变量。SQL注入不好
- 优化数据库以获得性能并更精确地制定查询!种族可以在自己的表中,使用
N:M
之间的关系
我认为您应该尝试交换以下引号:
$var = $db->Query("SELECT * FROM table WHERE race LIKE '%".$specie."%' OR race IS NULL");
至少,这是我要测试的东西,尽管我现在明白这不应该有什么不同。
您可以规范化您的设计,并引入单独的specie_sets
和specie_set_values
:
specie_sets:
set_id (PK)
specie_set_values:
set_id (FK) | value (INDEX)
您的table
将包含对specie_sets
(FK)的可为null的引用。
然后使用并集:
(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)