2012-04-26 82 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