繁体   English   中英

从 2 个表中计算 1 个用户的条目总数

[英]Count total of entries by 1 user from 2 tables

我正在尝试编写一个 SQL Select 语句,该语句将告诉我练习的总数和艺术家已记录的节目总数。 我有 3 张桌子,艺术家、实践和表演。

Practices 和 Shows 表中有一个 Artist_ID 作为外键,还有它们自己的自动递增 ID 和一个日期列。 我正在尝试计算每个用户拥有的练习总数和节目总数。

我已经尝试了几个语句.. 这是最新的尝试。

SELECT COUNT(P.Practice_ID) as NumberOfPractices, COUNT(S.Show_ID) as NumberOfShows
FROM Practices P                                                                      
INNER JOIN Artists A ON P.Artist_ID = A.Artist_ID
RIGHT JOIN Shows S ON A.Artist_ID = S.Artist_ID
WHERE A.Artist_ID = :artistID

这和我尝试过的其他一切似乎是将两个表的数量相乘。 例如,练习应该等于 21,表演应该等于 2。但我得到的结果都是 42。

    SELECT
     a.Artist_ID
     , COUNT(p.Practice_ID)
     , COUNT(s.Show_ID)

    FROM
     Artists a
    LEFT JOIN
     Practice p
    ON a.Artist_ID = p.Artist_ID
    LEFT JOIN
     Shows s
    ON a.Artist_ID = s.Artist_ID

    GROUP BY
     a.Artist_ID

关闭。 您的问题是笛卡尔连接——这就是为什么两个计数都返回相同的值。

最简单的解决方案是使用count(distinct)

SELECT COUNT(DISTINCT P.Practice_ID) as NumberOfPractices,
       COUNT(DISTINCT S.Show_ID) as NumberOfShows
FROM Practices P                                                                      
INNER JOIN Artists A ON P.Artist_ID = A.Artist_ID
RIGHT JOIN Shows S ON A.Artist_ID = S.Artist_ID
WHERE A.Artist_ID = :artistID;

但是,我建议简化代码:

SELECT (SELECT COUNT(DISTINCT P.Practice_ID)
        FROM Practices p
        WHERE p.Artist_ID = :artistID
       ) as NumberOfPractices,
       (SELECT COUNT(DISTINCT s.Show_ID)
        FROM Shows s
        WHERE s.Artist_ID = :artistID
       ) as NumberOfShows

您甚至不需要Artists表。

LEFT OUTER JOIN 被用作艺术家可以有 0 个表演或练习。

SELECT COUNT(DISTINCT P.Practice_ID) as NumberOfPractices, COUNT(DISTINCT S.Show_ID) as NumberOfShows
FROM Artists A 
LEFT OUTER JOIN Practices P ON P.Artist_ID = A.Artist_ID
LEFT OUTER JOIN Shows S ON A.Artist_ID = S.Artist_ID
WHERE A.Artist_ID = :artistID
GROUP BY A.Artist_ID 

您查询的问题是您从练习表开始,该表是一个子表(可以包含重复的艺术家 ID)。 当加入艺术家表时,您在 a.artist_id 列的中间结果集中引入了重复的艺术家 ID。

SELECT COUNT(P.Practice_ID) as NumberOfPractices, COUNT(S.Show_ID) as 
NumberOfShows
FROM Practices P                                                                      
INNER JOIN Artists A ON P.Artist_ID = A.Artist_ID --> here you introduced duplicates
RIGHT JOIN Shows S ON A.Artist_ID = S.Artist_ID 
WHERE A.Artist_ID = :artistID

为了避免重复,我建议从具有唯一艺术家 ID 的主表(艺术家)开始,并使用它来连接子表。

SELECT a.artist_id, COUNT(p.practice_id) as NumberOfPractices, 
count(s.show_id) as NumberOfShows 
FROM artists a
LEFT JOIN practices p ON (a.artist_id = p.artist_id)
LEFT JOIN shows s ON (a.artist_id = s.artist_id)
GROUP BY a.artist_id

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM