SQL 方法 return if all in join 匹配条件

SQL method to return if all in join match conditions

我浏览这个网站已经有一段时间了,这是我的第一个 post 所以我希望我已经学会了如何查询的正确方法...我一直被这个问题困扰很长一段时间,即使有了所有可用的信息,我仍然迷路了。

我有 3 个 table。 集、UserBudget、ItemCosts

table name               column names
-----------              ------------------------
Sets                     SetID 
UserBudget               UserID | ItemID | ItemBudget 
ItemCosts                SetID  | ItemID | ItemPrice

ItemCosts 包含多个项目,它们连接到 'Sets' table 条目。

只有当 UserBudget 具有与 ItemCosts 相同的项目并且所有 ItemPrice 等于或低于 ItemBudget 时,我才需要一种方法从第一个 table 开始 return SetID。

例如:

Sets                ItemCosts                 UserBudget
-----------         ----------                ----------
SetID      1        SetID      1              UserID     1
                    ItemID     1    2         ItemID     1    2 
                    ItemPrice  10   12        ItemBudget 11    11 

这不应该 return 任何东西,因为第二个项目的价格高于用户的预算。

Sets                ItemCosts                 UserBudget
-----------         ----------                ----------
SetID      1        SetID      1              UserID     1
                    ItemID     1    2         ItemID     1    2 
                    ItemPrice  10   12        ItemBudget 11    12 

这应该是 return 设置 1。

如果其中一项符合预算,我的任何尝试都会以 return 结束。 这是我当前的 SQL(它最终是一个超级简化的版本,因为我所有复杂的尝试都花了更长的时间来执行,但 return 得到了相同的结果):

SELECT * 
FROM UserBudget a 
  INNER JOIN ItemCosts b on a.ItemID=b.ItemID 
  INNER JOIN Sets c on b.SetID=c.SetID 
WHERE a.UserID=1 AND a.ItemBudget>=b.ItemPrice

您可以尝试下一个解决方案:

SELECT a.UserID, GROUP_CONCAT(DISTINCT b.SetID) SetIDs
FROM UserBudget a 
LEFT JOIN ItemCosts b on a.ItemID=b.ItemID  AND a.ItemBudget>=b.ItemPrice
LEFT JOIN Sets c on b.SetID=c.SetID 
WHERE a.UserID=1
GROUP BY a.UserID
HAVING COUNT(a.UserID) = COUNT(b.SetID)
;

MariaDB fiddle