我正在处理一个给我带来困难的查询。
基本上,我的数据库race
中有一个包含动态值的列(这些示例不是真正的内容,但代码是相同的。)
比赛可以为NULL(不需要特定比赛) 或种族可以持有一个或多个值(“人类,蜥蜴,狗”等)
我的查询是:
$var = $db->Query('SELECT * FROM table WHERE race LIKE "%'.$specie.'%" OR race IS NULL');
但是,这不起作用。此语句的流程中是否存在错误,使查询不返回任何内容? (显示默认的“空结果”)
编辑:在英语中我想让我的查询说“如果找到特定的种族,或者根本没有种族要求,则选择所有数据”(null)“
答案 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
');
标准备注适用于此:
N:M
关系。答案 2 :(得分:0)
您可以规范化您的设计并引入单独的specie_sets
和specie_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)