我需要根据某些选项选择文件名。我已经在数据库表中编码了一系列选项,例如:
__A___B___C__ .. __FEET_____FILENAME_____
| * | * | * | | 0 | ABC.pdf |
------------------------------------------|
| * | | * | | 1 | A_C_1foot.pdf |
------------------------------------------
其中几个字段(例如A,B,C)是布尔值,而其他一些字段(例如FEET)是正整数。当FEET为0时,表示它是通配符,任何正整数都应与该行匹配。我还有其他一些变量,例如FEET。那些是贝壳,模型。
对于任何一组选项,只应返回最大行数,并且应仅返回最小行数,因为该表保证存在一个匹配项,但不保证此匹配项是精确的。换句话说,总是返回完全匹配(如果没有精确匹配,则返回最佳匹配),并且保证一个或另一个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
利用这些字段可能包含正数的事实,但是当它们不包含正数时,会将它们选择为通配符。如果您同时输入0和X数字,则限制为1,如果在数据库中,则优先使用特定的正数(如果不是),则选择通配符。