1

在比较具有相同 sid 但不同 cid-data 值的多条记录后,我请求一些有关 MySQL when-then 语句的帮助,以从表中获取所有 sid:

flag    sid cid data
----    --- --- ----
1       300 1   john
1       300 2   john_email
1       300 3   77500
1       300 4   ok

1       301 1   jack
1       301 2   john_email
1       301 3   72210
1       301 4   notok

这里对于每个 sid,我需要检查 if (sid=2 has data=john_email) AND (sid=4 has data=ok) 只有当两个条件都满足时,我才返回 sid。即输出将仅为“300”。

我很困惑如何使用 case-when-then 并将 'data' 与 'john_email' 进行比较,并根据 cid 值将数据与 'ok' 进行比较。谢谢阅读。

4

3 回答 3

2

尝试

select sid
from your_table
group by sid
where (cid=2 and data='john_email')
or (cid=4 and data='ok')
having sum(cid=2)=1 and sum(data='john_email')=1
and sum(cid=4)=1 and sum(data='ok')=1

SQLFiddle 示例

于 2012-10-16T12:05:05.403 回答
0

您可以做的是使用子查询并检查该值是否存在。

SELECT
    *
FROM
    table outertable
WHERE
    ( cid=2 AND data='john_email' )
    AND
    EXISTS ( SELECT sid FROM table WHERE cid = 4 AND data = 'ok' AND sid = outertable.sid )
于 2012-10-16T12:08:57.853 回答
0

您应该将表连接到自身,然后您可以检查两行中的条件,就好像它是一行一样......

SELECT T1.sid
FROM MYTABLE T1
JOIN MYTABLE T2 ON T1.SID=T2.SID AND T1.CID=1 AND T2.CID=4
WHERE T1.DATA='john'
AND T2.DATA='ok'

请注意,我在 join 子句中使用了 CID 值,但如果要在不同的数据行上连接,则必须调整它们...

于 2012-10-16T12:04:58.823 回答