【问题标题】:Return result even if not within the joint tables即使不在联合表内也返回结果
【发布时间】: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种情况:

  1. @PUB 中的所有发布者都存在两个表
  2. @PUB 中有发布者存在于表 1 中,但不存在于表 2 中。
  3. @PUB 中存在表 2 中存在的发布者,但表 1 中不存在。
  4. @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”按要求显示

标签: mysql sql count


【解决方案1】:

如果您没有大列表,您可以尝试以下操作,您也许可以创建一个为您生成查询的过程

(
    SELECT p.publisher_ID, sum(IF(v.Previous_Violations = 'Y', 1, 0)) AS "Number of Violations"
    FROM (SELECT 'A' AS publisher_ID) AS p LEFT JOIN Violations v USING(publisher_ID) 
    GROUP BY p.publisher_ID
)
UNION
(
     SELECT p.publisher_ID, sum(IF(v.Previous_Violations = 'Y', 1, 0)) AS "Number of Violations"
    FROM (SELECT 'B' AS publisher_ID) AS p LEFT JOIN Violations v USING(publisher_ID) 
    GROUP BY p.publisher_ID)
UNION
(
     SELECT p.publisher_ID, sum(IF(v.Previous_Violations = 'Y', 1, 0)) AS "Number of Violations"
    FROM (SELECT 'C' AS publisher_ID) AS p LEFT JOIN Violations v USING(publisher_ID) 
    GROUP BY p.publisher_ID)
UNION
(
     SELECT p.publisher_ID, sum(IF(v.Previous_Violations = 'Y', 1, 0)) AS "Number of Violations"
    FROM (SELECT 'D' AS publisher_ID) AS p LEFT JOIN Violations v USING(publisher_ID) 
    GROUP BY p.publisher_ID
)
UNION
(
     SELECT p.publisher_ID, sum(IF(v.Previous_Violations = 'Y', 1, 0)) AS "Number of Violations"
    FROM (SELECT 'E' AS publisher_ID) AS p LEFT JOIN Violations v USING(publisher_ID) 
    GROUP BY p.publisher_ID
)

【讨论】:

  • 您好,非常感谢,但这不起作用,因为有时我们必须与 40-50 个发布商打交道
猜你喜欢
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2019-11-11
  • 2012-09-09
  • 2020-03-20
  • 1970-01-01
相关资源
最近更新 更多