2014-09-21 32 views
2

我有一個簡單的數據庫,使用表單條目來確定要顯示的文件。但幾乎沒有任何表單字段是必需的,我的許多數據庫條目都是類似主題的變體。給定一組值,什麼SQL查詢將找到我的數據庫中的行與大多數這些值?

如何創建一個SQL查詢,該查詢將返回具有與輸入的表單值最匹配的列的數據庫中的條目?

例如這裏是我的數據庫的一個例子:

Filename Val1 Val2 Val3 Val4 Val5 
one   red  blue     yellow 
two   red  blue 
three  red  blue green   yellow 
four  red  blue green violet 

值從我的形式進來:

Val1: red 
Val2: blue 
Val3: blue 
Val4: red 
Val5: yellow 

是否有一個SQL查詢將返回文件名「一」,因爲它列表項中的列與列中的值最匹配,並且沒有列是非輸入值的列?如果沒有,如何使用表單條目來查找文件名「one」?

我確定有些東西很簡單,我只是缺少經驗,但顯然「AND」不起作用,而「OR」會返回每一行。

回答

1

我想你想是這樣的:

select t.* 
from table t 
order by ((col1 in (val1, val2, val3, val4, val5)) + 
      (col2 in (val1, val2, val3, val4, val5)) + 
      (col3 in (val1, val2, val3, val4, val5)) + 
      (col4 in (val1, val2, val3, val4, val5)) + 
      (col5 in (val1, val2, val3, val4, val5)) 
     ) desc 
limit 1; 

此計算匹配值的數量,最匹配,則返回該行。它可能對null值有意外的行爲。如果是的話,這裏有一個簡單的解決方法:

select t.* 
from table t 
order by ((coalesce(col1, '') in (val1, val2, val3, val4, val5)) + 
      (coalesce(col2, '') in (val1, val2, val3, val4, val5)) + 
      (coalesce(col3, '') in (val1, val2, val3, val4, val5)) + 
      (coalesce(col4, '') in (val1, val2, val3, val4, val5)) + 
      (coalesce(col5, '') in (val1, val2, val3, val4, val5)) 
     ) desc 
limit 1; 

編輯:

它看起來像值是 「位置」,因此in可以=更換:

select t.* 
from table t 
order by ((coalesce(col1, '') = val1) + 
      (coalesce(col2, '') = val2) + 
      (coalesce(col3, '') = val3) + 
      (coalesce(col4, '') = val4) + 
      (coalesce(col5, '') = val5) 
     ) desc 
limit 1; 
相關問題