SQL metoda se vrátit, pokud vše v join match podmínky

0

Otázka

Byl jsem prohlížení to stránky už nějakou dobu a tohle je můj první příspěvek, tak doufám, že jsem se naučil správný způsob, jak se zeptat... byla jsem přilepená na tento problém na nějakou dobu i přes všechny dostupné informace, pořád jsem ztracená.

Mám 3 tabulky. Sady, UserBudget, ItemCosts

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

ItemCosts obsahuje více položek, které jsou připojeny k 'Soubory' záznam v tabulce.

Potřebuji způsob, jak vrátit SetID je z první tabulky pouze tehdy, pokud UserBudget má stejné položky jako ItemCosts a všechny ItemPrice je rovna nebo nižší, aby ItemBudget.

Například:

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

Tohle nemá nic vracet, protože druhá položka cena je vyšší, než uživatel je rozpočet na to.

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

Tohle má vrátit Nastavit 1.

Jakékoliv mé pokusy skončí vrácení nastavit, pokud jedna z položek odpovídá rozpočtu. Tady je moje aktuální SQL (to je velmi zjednodušené verzi, nakonec jako všechny moje složité pokusy trvalo déle, spustit, ale vrátil se stejný výsledek):

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
mariadb sql
2021-11-22 11:27:15
1

Nejlepší odpověď

0

Můžete zkusit další řešení:

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 housle

2021-11-22 13:03:20

V jiných jazycích

Tato stránka je v jiných jazycích

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................