SQL选择行与其他行参数

时间:2015-07-05 06:05:39

标签: sql firebird

我的第一列表格为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

现在很清楚了吗?

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 ',')
关于ORDERSEPARATOR

如果需要调整/进一步详细说明,请发表评论。

答案 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')