在结果中使用COUNT个查询

时间:2018-02-15 06:14:34

标签: mysql sql

我有3张桌子:

  • biblio(biblionumber,title);
  • items(itemnumber,biblionumber);
  • old_issues(issues_id,itemnumber,issate)

biblio与商品有一对多关系 items与old_issues有一对多的关系。

我想知道每个独特的biblio标题在biblio表中有多少项,以及在一个日期范围内发出该项目的次数。然后在最后一栏中我想要项目的比例与它发出的次数之比:

biblio title | Copies of title (Count of items in biblio) | Count of issues | count of items / count of issues

我遇到的问题是,如果我加入所有表格,我就不能准确计算biblio表中有多少项目,因为它们只会在已经发布的情况下被计算在内

例如,如果我有一个标题"终结者2" (biblio表中的一个唯一条目)它有5个副本(items表中有5个唯一条目),但之前没有发布过这些副本,那么我将得到0个项目的数量。

我应该得到如下结果:

"终结者2"在图书馆有5份,在2017年已发行245次。这是0.02的比例,这意味着我们需要订购更多的副本才能达到需求!

我认为我必须做一个独立于另一个表中的结果的某种子查询/嵌套查询,但不知何故将表连接在一起以获得一个视图。我太业余了,不知道该怎么做,所以任何帮助都会受到赞赏。 对不起,如果我的解释很难理解。

以下是我尝试使用的查询:

SELECT biblio.title, COUNT(items.itemnumber), COUNT(old_issues.itemnumber)
FROM old_issues
JOIN items ON old_issues.itemnumber = items.itemnumber
JOIN biblio ON items.biblionumber = biblio.biblionumber
WHERE old_issues.issuedate BETWEEN '2018-02-01' AND '2018-02-03'
GROUP BY biblio.biblionumber

1 个答案:

答案 0 :(得分:3)

您可能希望交换表并使用LEFT JOIN,因此即使不在日期范围内,行仍会显示,但值为0。

SELECT  b.biblionumber,
        b.title, 
        COUNT(DISTINCT i.itemnumber) AS `Total Copies`, 
        COUNT(o.itemnumber) AS `Total Issues`,
        COUNT(DISTINCT  i.itemnumber) / COUNT(o.itemnumber)   AS `Ratio`
FROM    biblio b
        LEFT JOIN items i
            ON b.biblionumber = i.biblionumber
        LEFT JOIN old_issues o
            ON o.itemnumber = i.itemnumber
                AND o.issuedate BETWEEN '2018-02-01' AND '2018-02-03'
GROUP   BY  b.biblionumber,
            b.title

这是Demo