我需要根据某些选项选择文件名。我已经在数据库表中编码了一系列选项,例如:

__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,如果在数据库中,则优先使用特定的正数(如果不是),则选择通配符。

10-02 13:40