我有一张表(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个。
2。 使用SELECT为Filter1和Filter2单独查找结果,使用INTERSECT将它们相交。
我还有一个问题是创建另一个表,其中所有Filter字段都是varchar而不是int,然后搜索文本是否有用?许多人建议我避免这种情况,因为这也会导致效率问题。但是,对同一个select查询中的12个varchar字段进行过滤会比在int字段上调用12个选择查询并将它们组合起来更有效吗???
答案 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
和所有过滤器值。