Mysql 在结果中使用查询计数

Mysql 在结果中使用查询计数,mysql,sql,Mysql,Sql,我有三张桌子: 图书馆(图书馆编号、标题) 项目(项目编号、图书编号) 旧问题(问题id、项目编号、发布日期) biblio与项目有一对多的关系。 项目与旧问题存在一对多关系 我想知道每个独特的图书标题在图书表中有多少个项目,以及该项目在一个日期范围内发行了多少次。在最后一列中,我想知道项目与发行次数的比率: biblio title | Copies of title (Count of items in biblio) | Count of issues | count of items

我有三张桌子:

  • 图书馆
    (图书馆编号、标题)
  • 项目
    (项目编号、图书编号)
  • 旧问题
    (问题id、项目编号、发布日期)
biblio
与项目有一对多的关系。
项目
与旧问题存在一对多关系

我想知道每个独特的图书标题在图书表中有多少个项目,以及该项目在一个日期范围内发行了多少次。在最后一列中,我想知道项目与发行次数的比率:

biblio title | Copies of title (Count of items in biblio) | Count of issues | count of items / count of issues
我遇到的问题是,如果我加入所有的表,我将无法准确计算出图书表中有多少项目,因为它们只有在发布后才会被计算

例如,如果我有一个标题“Terminator 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

您可能希望交换表并使用
左联接
,这样即使不在日期范围内,但值为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

这里有一个。

试试
count(不同字段)
您通常会按照您选择的列进行分组,设置函数的参数除外。请注意,与您的问题相比,John的答案要简洁得多。谢谢您的提示。这是我的第一篇文章,我做了你链接中的建议,尽管没有你说的那么简洁。我会在以后的帖子中记住这一点。谢谢你!在看了你的演示后,这看起来是可行的。我没有意识到可以在join语句中添加额外的条件,而且我还认为我的join语句将保留两个表中的所有数据,但看起来左join才是我想要的。明天我会尝试一下。@BoostBoy另一方面,如果您想根据日期范围筛选出结果,请将
LEFT
更改为
internal
,并在
WHERE
子句中移动日期筛选器。