我需要根据某些选项选择文件名。我在数据库表中编码了一系列选项,例如:
__A___B___C__ .. __FEET_____FILENAME_____
| * | * | * | | 0 | ABC.pdf |
------------------------------------------|
| * | | * | | 1 | A_C_1foot.pdf |
------------------------------------------
其中几个字段,如A、B、C是布尔值,而其他一些字段,如FEET是正整数。当FEET为0时,这意味着它是一个通配符,任何正整数都应该与该行匹配。我还有其他几个变量,比如FEET。那些是贝壳,模特。
对于任何一组选项,都应该只返回一行max,而只返回一个行min,因为表保证有一个匹配,但不能保证它是精确的。换句话说,总是返回精确匹配(或者如果精确不可用,则返回最佳匹配),并且其中一个或另一个ro都保证存在。
问题
我不知道表中是否有完全匹配的行,或者是否有通配符。甚至可能两者都有,如果可以的话,确切的结果应该是有利的。我的SQL是这样的:
SELECT filename
FROM table
WHERE A = $a
and B = $b
and C = $c
and FEET = $feet
and MODEL = $model
and SHELLS = $shells;
当所有FEET、MODEL和SHELLS都没有完全匹配时,它将失败,并为某些FEET、SHELLS和MODEL值返回0行。我需要返回最匹配的行。
将SQL更改为
SELECT filename WHERE ...
AND (FEET = $feet or FEET = 0)
AND (SHELLS = $shells or SHELLS = 0)
AND (MODEL = $model or MODEL = 0)
ORDER BY FEET DESC, SHELLS, MODEL
LIMIT 1
利用这样一个事实,即这些字段可能包含正数,但当它们不包含正数时,它们将被选为通配符。LIMIT 1适用于同时有0和X数字的条目的情况,如果数据库中有特定的正数,则优先选择该正数,但如果没有,则选择通配符。