左连接请求中的SQLite计数
我的型号是1,葡萄酒可以有很多瓶。这些瓶子的字段输出类型为NULL或NOTNULL 事实上,我可以这样数瓶子:左连接请求中的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 这很有效 但现在我需要更多:我想在同一个请求中计算存储的瓶
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)
- 为列表中的每种葡萄酒计数已用完的酒瓶(输出类型不为空)
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
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