我有一个具有这种结构的表:
Field A Field B Field C
a1 b1 t1
a1 b1 t2
a2 b1 t1
a2 b1 t2
字段A和字段B是相关的,对于给定的b *,有几个a *。
我需要列出满足以下条件的字段A或字段B:
在前面的例子中,没有列出任何内容,因为b1有a1和a2,a1和a2都有相同的信息:它们都有t1和t2。
在下一个例子中,我需要检测属于b1的a1和a2有不同的信息(a1:t1和t2; b1:只有t1,它没有t2)。
Field A Field B Field C
a1 b1 t1
a1 b1 t2
a2 b1 t1
a3 b2 t3
查询将显示a1,a2或b1。
我知道这很复杂,但我需要获取这些信息。
谢谢!
答案 0 :(得分:0)
您实际上需要添加解释,说明为什么第一个示例中没有任何内容返回到需求。
示例1的解决方案:
SELECT
t.B,
GROUP_CONCAT(DISTINCT t.A)
FROM
t
INNER JOIN (
SELECT
B,
A
FROM
t
GROUP BY B, A
HAVING
COUNT(DISTINCT C) > 1
) q ON t.A = q.A AND t.B = q.B /* a* has 1 to N t* */
WHERE t.B IN (
SELECT sq.B FROM (
SELECT st.B, GROUP_CONCAT(st.C ORDER BY st.C) AS gcc FROM t AS st GROUP BY st.B, st.A
) sq GROUP BY sq.B HAVING COUNT(DISTINCT gcc) > 1
) /* if two a* belonging to the same b* have different t*, then I need to list that a* or its parent b* */
GROUP BY t.B
HAVING
COUNT(DISTINCT t.A) > 1 /* b* has several a* */
;
你的第二个例子对我来说并不清楚。但我想你的意思是:
SELECT
B, A
FROM
t
WHERE A IN ('a1', 'a2')
GROUP BY B, A
HAVING
COUNT(DISTINCT C) > 1
OR
COUNT(*) = 1;