MySQL A 或 B 但不是两者
MySQL A or B but NOT both
这似乎是一个简单的查询,但我似乎无法理解它或将其与堆栈溢出上的其他帖子联系起来。谁能解释一下...这就是我目前所知道的,它正在返回一个人或两个人去过的所有酒吧的记录。
TBL frequents Schema - drinker VARCHAR(50) PK,bar VARCHAR(50) PK
John 或 Rebecca 经常光顾但两人都不常光顾的酒吧
SELECT DISTINCT bar
FROM frequents
WHERE drinker = 'John' XOR drinker = 'Rebecca'
AND bar NOT IN (
SELECT f1.bar
FROM frequents f1, frequents f2
WHERE (
f1.drinker = 'John'
AND f2.drinker = 'Rebecca'
AND f1.bar = f2.bar
)
);
像这样应该满足规范:
SELECT f.bar
FROM frequents f
WHERE f.drinker IN ('John','Rebecca')
GROUP
BY f.bar
HAVING COUNT(DISTINCT f.drinker) < 2
- 获取 'John' and/or 'Rebecca'
的全部 bar
- 将每个
bar
的行折叠成一行
- 为每个柱获得
drinker
的计数
- 丢弃计数为 2 的行(即 John 和 Rebecca)
- 只为约翰而不是丽贝卡保留
bar
的值,反之亦然
这似乎是一个简单的查询,但我似乎无法理解它或将其与堆栈溢出上的其他帖子联系起来。谁能解释一下...这就是我目前所知道的,它正在返回一个人或两个人去过的所有酒吧的记录。
TBL frequents Schema - drinker VARCHAR(50) PK,bar VARCHAR(50) PK
John 或 Rebecca 经常光顾但两人都不常光顾的酒吧
SELECT DISTINCT bar
FROM frequents
WHERE drinker = 'John' XOR drinker = 'Rebecca'
AND bar NOT IN (
SELECT f1.bar
FROM frequents f1, frequents f2
WHERE (
f1.drinker = 'John'
AND f2.drinker = 'Rebecca'
AND f1.bar = f2.bar
)
);
像这样应该满足规范:
SELECT f.bar
FROM frequents f
WHERE f.drinker IN ('John','Rebecca')
GROUP
BY f.bar
HAVING COUNT(DISTINCT f.drinker) < 2
- 获取 'John' and/or 'Rebecca' 的全部
- 将每个
bar
的行折叠成一行
- 为每个柱获得
drinker
的计数 - 丢弃计数为 2 的行(即 John 和 Rebecca)
- 只为约翰而不是丽贝卡保留
bar
的值,反之亦然
bar