组合具有相同ID的列并搜索数据

时间:2015-07-22 16:21:44

标签: sql

我有一张表(tblABC),看起来像

-------------------------------
BasicID   | Filter1 | Filter2 |
-------------------------------
 100          1         2
 100          3         4
 101          8         9

我想要做的是 - 我想选择具有Filter1 = 1和Filter2 = 4的BasicID。即我想得到输出 100

我可以通过组合BasicID来创建某个视图。看似与

相似的东西
--------------------------------
BasicID   | Filter1|  Filter2 |
--------------------------------
 100          1,3         2,4
 101          8            9

完成此操作后,我可以使用简单的搜索查询进行搜索,例如
'选择BasicID tblNewlyCreatedTable,其中Filter1 = 1,Filter2 = 4' 并将输出设为100.

为了解决这个问题,我尝试了以下方法,所有这些都让我失望,因为它没有效率,因为我有大约12个过滤器来过滤。此外,并非所有过滤器都会一直应用,有时它将是4个过滤器,有时是2个,时间都是12个。

  1. 从tblABC中选择* 哪里 和BasicID ( 从tblABC中选择BasicID
    哪里Filter1 IN(1) ) 和BasicID ( 从tblABC中选择BasicID
    其中Filter2 IN(4) )
  2. 2。 使用SELECT为Filter1和Filter2单独查找结果,使用INTERSECT将它们相交。


    我还有一个问题是创建另一个表,其中所有Filter字段都是varchar而不是int,然后搜索文本是否有用?许多人建议我避免这种情况,因为这也会导致效率问题。但是,对同一个select查询中的12个varchar字段进行过滤会比在int字段上调用12个选择查询并将它们组合起来更有效吗???

2 个答案:

答案 0 :(得分:0)

对于MySQL

SELECT BasicID, 
GROUP_CONCAT(FILTER1 ORDER BY FILTER1 ASC SEPARATOR ', ') AS FILTER1,
GROUP_CONCAT(FILTER2 ORDER BY FILTER2 ASC SEPARATOR ', ') AS FILTER2
FROM tblABC
GROUP BY BASICID

答案 1 :(得分:0)

with filters as
(select 1 as val from dual union select 2 as val from dual
--add more values when needed 
)
select basicid from tblABC where Filter1 in (select val from filters)
intersect
select basicid from tblABC where Filter2 in (select val from filters)

这会使用cte和所有过滤器值。