左连接请求中的SQLite计数

左连接请求中的SQLite计数,sqlite,count,Sqlite,Count,我的型号是1,葡萄酒可以有很多瓶。这些瓶子的字段输出类型为NULL或NOTNULL 事实上,我可以这样数瓶子: SELECT COUNT(DISTINCT(bottles.id)) AS total_bottles FROM wines LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status=1 AND bottles.output_type IS NULL 这很有效 但现在我需要更多:我想在同一个请求中计算存储的瓶

我的型号是1,葡萄酒可以有很多瓶。这些瓶子的字段输出类型为NULL或NOTNULL

事实上,我可以这样数瓶子:

SELECT COUNT(DISTINCT(bottles.id)) AS total_bottles
FROM wines
LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status=1 AND bottles.output_type IS NULL
这很有效

但现在我需要更多:我想在同一个请求中计算存储的瓶子(output_type NULL)和消失的瓶子(output_type NOT NULL)

所以我的左连接是不够的,因为我无法计算主请求中存储的瓶子和丢失的瓶子

我看到过类似的情况,包括左连接中的“sub-request”:

LEFT JOIN (SELECT count(*) AS bottle_stored FROM bottles WHERE bottles.status=1 AND bottles.output_type IS NULL) AS total_stored ON wines.id = bottles.wine_id
但这是行不通的。如果这是工作,我可以复制左连接计数消失的瓶子

编辑: 这里有更多的解释。这是我目前的要求。我可以计算每种葡萄酒存储的所有瓶子(输出类型为空)

SELECT wines.id, wines.winery
COUNT(DISTINCT(bottles.id)) AS total_bottles
FROM wines   
LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status=1 AND bottles.output_type IS NULL 
WHERE wines.status = 1  
GROUP BY wines.id  
编辑2(添加了数据库模式):

我想:

  • 列出所有葡萄酒
  • 为列表中的每种葡萄酒计数存储的瓶子(输出类型NULL)
  • 为列表中的每种葡萄酒计数已用完的酒瓶(输出类型不为空)
在同一请求中

我的主键和外键都是varchar,因为它是UUID(全局同步系统)。

试试这个:

SELECT COUNT(DISTINCT(bottles.id)) AS bottles_stored, 
       (SELECT COUNT(DISTINCT(bottles.id)) AS total_bottles
          FROM wines
          LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status = 1) - COUNT(DISTINCT(bottles.id)) AS bottles_gone
  FROM wines
  LEFT JOIN bottles ON wines.id = bottles.wine_id AND bottles.status = 1 AND bottles.output_type IS NULL
  • 选择存储的所有瓶子=>瓶子。输出类型=空
  • 用于计算瓶子总数的子查询
  • 从总瓶数中减去储存的瓶数=>已用完的瓶数
  • 第二次编辑穆卡达后更新:

    首先,查询列出所有葡萄酒(1):

    接下来,我们统计特定葡萄酒id=1的所有储存瓶(2)和消失瓶(2):

    SELECT COUNT(b.id) 
      FROM bottles AS b 
     WHERE b.output_type IS NULL AND 
           b.wine_id = 1
    

    作为第三步,我们将所有三个查询与查询(2)和(3)合并为子查询,并将外部查询中的静态id=1替换为w.id:

    SELECT w.id,
           w.name,
           w.winery,
           (SELECT COUNT(b.id) 
              FROM bottles AS b 
             WHERE b.output_type IS NULL AND 
                   b.wine_id = w.id) AS bottles_stored,
           (SELECT COUNT(b.id) 
              FROM bottles AS b 
             WHERE b.output_type IS NOT NULL AND 
                   b.wine_id = w.id) AS bottles_gone
      FROM wines
    

    我很抱歉,但这似乎是把每一瓶酒的所有瓶子都计算在内,然后加上它们作为结果。我没有每种葡萄酒的瓶数。然后,您必须向我们提供有关问题的更多详细信息,可能还有一些代码或表的数据库设计。当我进行第二次选择计数瓶数时,它是计算所有葡萄酒的瓶数,而不是每种葡萄酒的瓶数。正如我所说,请提供一些更详细的解释(例如,数据库表的结构)。猜测是浪费时间!对不起,Paul,我添加了一些有关DB架构的详细信息。谢谢。是否缺少分组依据?是的,我添加了它。;)
    SELECT COUNT(b.id) 
      FROM bottles AS b 
     WHERE b.output_type IS NULL AND 
           b.wine_id = 1
    
    SELECT COUNT(b.id) 
      FROM bottles AS b 
     WHERE b.output_type IS NOT NULL AND 
           b.wine_id = 1
    
    SELECT w.id,
           w.name,
           w.winery,
           (SELECT COUNT(b.id) 
              FROM bottles AS b 
             WHERE b.output_type IS NULL AND 
                   b.wine_id = w.id) AS bottles_stored,
           (SELECT COUNT(b.id) 
              FROM bottles AS b 
             WHERE b.output_type IS NOT NULL AND 
                   b.wine_id = w.id) AS bottles_gone
      FROM wines