gpt4 book ai didi

sql - 在子查询的结果集中计数

转载 作者:行者123 更新时间:2023-11-29 12:45:16 25 4
gpt4 key购买 nike

我的数据库中有以下关系:

Invoice                           InvoiceMeal
--------------------- ---------------------------
| InvoiceId | Total | | Id | InvoiceId | MealId |
--------------------- ---------------------------
| 1 | 22.32 | | 1 | 1 | 3 |
--------------------- ---------------------------
| 2 | 12.18 | | 2 | 1 | 2 |
--------------------- ---------------------------
| 3 | 27.76 | | 3 | 2 | 2 |
--------------------- ---------------------------

Meal Type
----------------------------------- -------------------
| Id | Name | TypeId | | Id | Name |
----------------------------------- -------------------
| 1 | Hamburger | 1 | | 1 | Meat |
----------------------------------- -------------------
| 2 | Soja Beans | 2 | | 2 | Vegetarian |
----------------------------------- -------------------
| 3 | Chicken | 2 |
-----------------------------------

我想从数据库中查询的是所有 InvoicesInvoiceIdTotal,其中至少包含两个 Meals 其中至少有一个 MealsType Vegetarian。我有以下 SQL 查询并且它有效:

SELECT 
i."Id", i."Total"
FROM
public."Invoice" i
WHERE
(SELECT COUNT(*)
FROM public."InvoiceMeal" im
WHERE im."InvoiceId" = i."Id" AND
(SELECT COUNT(*)
FROM public."Meal" m, public."Type" t
WHERE im."MealId" = m."Id" AND
m."TypeId" = t."Id" AND
g."Name" = 'Vegetarian') > 0
) >= 2;

这个查询的问题是我不能轻易修改必须至少有一份素食 Meal 的条件。例如,我希望能够将其更改为至少两顿素食。如何通过我的查询实现此目的?

最佳答案

我会通过将表连接在一起并使用聚合来解决这个问题。 having 子句可以处理以下条件:

select i.Id, i.Total
from InvoiceMeal im join
Invoice i
on i.InvoiceId = im.InvoiceId join
Meal m
on im.mealid = m.mealid join
Type t
on m.typeid = t.typeid
group by i.Id, i.Total
having count(distinct im.mealid) >= 2 and
sum(case when t.name = 'Vegetarian' then 1 else 0 end) > 0;

我也认为没有理由在列名周围加上双引号。这只会让查询更难编写和阅读。

关于sql - 在子查询的结果集中计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26563430/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com