我的第一列表格为ID(非唯一),第二列只有一个参数。可以有更多具有相同ID和不同参数的行,我需要选择具有参数逻辑组合的ID
例如,仅选择有参数“A”和(“B”或“C”)的ID,或者至少只选择带参数“A”和“B”的ID。
DB在Firebird中,但如果没有别的办法,将它转换为MySQL就没问题了。
编辑:
表:
+----+-----------+
| ID + PARAMETER |
+----+-----------+
| 1 | A |
| 1 | B |
| 2 | B |
| 3 | A |
| 3 | C |
+----------------+
我需要获得每个ID,其中PARAMETER A和B = ID 1或ID,PARAMETER A和(B或C)= ID 1,3
现在很清楚了吗?
答案 0 :(得分:2)
MySQL开发人员似乎讨厌子查询,但这确实是正确的方法。我可能没有完全按照你的要求获得条件,但它应该是接近的。我认为A和B条件对A和(B或C)是多余的。
select distinct ID
from T t1
where exists (
select 1
from T t2
where t2.ID = t1.ID
group by t2.ID
having
count(case when t2.parameter = 'A' then 1 else null end) > 0
and count(case when t2.parameter in ('B', 'C') then 1 else null end) > 0
)
由于在所有情况下都需要A,因此您可能会发现这样做的性能有所改善,但它的通用性稍差。
select distinct ID
from T t1
where t1.parameter = 'A' and exists (
select 1
from T t2
where t2.ID = t1.ID and t2.parameter in ('B', 'C')
)
答案 1 :(得分:1)
恢复MySQL。 创建视图后
CREATE VIEW ParameterList AS
SELECT
id
, GROUP_CONCAT(DISTINCT parameter ORDER BY parameter SEPARATOR ',') pList
FROM SomeTable
GROUP BY id
;
你可以:
SELECT
id
FROM ParameterList
WHERE pList = 'A,B'
;
SELECT
id
FROM ParameterList
WHERE pList IN ('A,B', 'A,C')
;
查看实际操作:SQL Fiddle。
当然,您需要严格制定查询:要检查的项目必须与视图一致排列
GROUP_CONCAT(DISTINCT parameter ORDER BY parameter SEPARATOR ',')
关于ORDER
和SEPARATOR
。
如果需要调整/进一步详细说明,请发表评论。
答案 2 :(得分:0)
我认为你可以使用ID,“每个条件一次”将表连接到自身,即获取具有PARAMETER A和B的ID:
SELECT distinct a.ID
FROM tab a
join tab b on(a.id = b.id)
where a.PARAMETER = 'A' and b.PARAMETER = 'B'
获取PARAMETER A和(B或C)的ID
SELECT distinct a.ID
FROM tab a
join tab b on(a.id = b.id)
where a.PARAMETER = 'A' and (b.PARAMETER = 'B' or b.PARAMETER = 'C')