2012-04-26 54 views
2

我正在對具有6個不同列的數據庫進行自定義搜索。 爲了使搜索我有6個不同的輸入字段,只接受數字。Mysql選擇匹配4,5或6列

我已經拿到了6列搜查工作,代碼:

SELECT * FROM data 
WHERE 1_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') 
AND 2_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') 
AND 3_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') 
AND 4_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') 
AND 5_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') 
AND 6_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') 
ORDER BY id ASC; 

這使得儘管輸入的順序正確的結果。

但我需要選擇給我的結果,無論它發現匹配輸入的數字4或5。我嘗試了OR,但我不知道如何定義匹配的列的數量。

這可能嗎?

感謝您的關注!

編輯:-------------------

我被困與dbaseman提供的代碼。

因爲我得到了一個真實的結果,但我真的不知道它是否是通過匹配4,5或6列產生的。

我期待插入CASE WHEN後,但不工作。

有沒有辦法知道列的哪個組合給了我結果?

想到類似於(粗略)if = 4,then result-4,else if = 5,then result-5 ... etc ... 然後就可以將該行放入數組中。

謝謝!

+0

這類問題有時是對症慘不忍睹的設計。 – Strawberry 2013-07-08 17:35:21

回答

4

而不是使用和/或總結命中:

SELECT *, 
    CASE WHEN 1_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_1, 
    CASE WHEN 2_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_2, 
    CASE WHEN 3_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_3, 
    CASE WHEN 4_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_4, 
    CASE WHEN 5_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_5, 
    CASE WHEN 6_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_6, 

    CASE WHEN 1_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 2_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 3_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 4_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 5_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 6_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    AS no_of_matches 
FROM data 
WHERE 
    (
    CASE WHEN 1_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 2_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 3_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 4_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 5_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    + CASE WHEN 6_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END 
    ) in (4,5,6) 
ORDER BY id ASC; 

備用,使用嵌套查詢了一下漂亮:

SELECT a.*, a.match_1+a.match_2+a.match_3+a.match_4+a.match_5+a.match_6 AS no_of_matches 
FROM (
    SELECT *, 
     CASE WHEN 1_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_1, 
     CASE WHEN 2_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_2, 
     CASE WHEN 3_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_3, 
     CASE WHEN 4_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_4, 
     CASE WHEN 5_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_5, 
     CASE WHEN 6_column IN ('$a1a','$a2a','$a3a','$a4a','$a5a','$a6a') THEN 1 ELSE 0 END AS match_6 
     FROM data 
    ) a 
WHERE a.match_1+a.match_2+a.match_3+a.match_4+a.match_5+a.match_6 in (4,5,6) 
ORDER BY id ASC; 
+0

哇!那很快!它非常棒dbaseman。 我想爲每個匹配輸出不同的答案,我可以使用php IF嗎? – tibelchior 2012-04-26 23:27:32

+0

@tibelchior肯定...看到我的更新。這有點醜陋,但它能完成這項工作。我會添加另一種更漂亮的方法... – McGarnagle 2012-04-27 01:49:10