如何从表中选择一行,该表包含一个具有正整数的字段,但0用于表示“0”;任何”;


How to select a row from a table, which contains a field with a positive integer, but 0 is used to mean "any"

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

__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数字的条目的情况,如果数据库中有特定的正数,则优先选择该正数,但如果没有,则选择通配符。