【发布时间】:2017-06-22 22:20:09
【问题描述】:
谁能帮我完成这个任务?假设我有 2 张桌子:
_表 1“出版商”:ASIN、价格、出版商_ID
_表 2“违规”:ASIN、Publisher_ID、Previous_Violations (Y/N)、ID
现在我有了这个
SET @PUB = "
'A','B','C','D',
"
SELECT p.publisher_ID, count(distinct v.id) as "Number of Violations"
FROM Publisher p
LEFT JOIN Violations v
ON p.publisher_ID = v.publisher_ID
and p.Previous_Violations = 'Y'
WHERE
p.publisher_ID IN (",@PUB,")
GROUP BY p.publisher_ID
我想查看@PUB 列表中所有发布者的历史违规行为。所以会有4种情况:
- @PUB 中的所有发布者都存在两个表
- @PUB 中有发布者存在于表 1 中,但不存在于表 2 中。
- @PUB 中存在表 2 中存在的发布者,但表 1 中不存在。
- @PUB 中的发布者在 2 个表中都不存在。
为了澄清,假设酒吧 A 和 B 存在于两个表中,C 存在于表 1(不是 2)中,D 存在于表 2(但不是 1)中,并且 E 都不存在于任何一个中。
现在我上面的查询只给出(由于左连接)
一个 3
B 2
C 4
但我希望它显示:
一个 3
B 2
C 4
D 6
E 空
【问题讨论】:
-
您能否发布您的实际数据,以便我们了解 E 和 D 没有出现的原因
-
如果记录在您选择的任何一个表中都不存在,您将永远不会在选择中获得 E。这是你要解决的第一个问题。
-
使用“FULL OUTER JOIN”而不是left join来获得D。就获得E而言,您可能需要将@PUB中的所有值加载为临时表并执行“full outer join”在所有这三张桌子上。
-
@maSTAShuFu 抱歉,我不能这样做,因为数据包含个人信息。但我能说的是我们的数据库有时会搞砸所以1)。 D 没有出现,因为我们在出版商和 ASIN 的信息上传之前对一些书籍采取了行动(表 2)(表 1) 2) E 没有出现,因为信息没有上传(表 1)并且已经没有违规(表 2)但是 pub D 和 E 确实存在
-
dilsingi 我不认为 MySQL 允许完全外连接。另外,我正在考虑创建一个包含 1 列的表格并填写 @PUB。但是,我不知道如何也不知道如何加入其余部分以确保“E”按要求显示