我正在使用phpMyAdmin,我有两个SQL表:
___SalesTaxes
|--------|----------|------------|
| STX_Id | STX_Name | STX_Amount |
|--------|----------|------------|
| 1 | Tax 1 | 5.00 |
| 2 | Tax 2 | 13.50 |
|--------|----------|------------|
___库存
|--------|----------|----------|---------------------|
| INV_Id | INV_Name | INV_Rate | INV_ApplicableTaxes |
|--------|----------|----------|---------------------|
| 10 | Bike | 9.00 | 1 |
| 11 | Movie | 3.00 | 1,2 |
|--------|----------|----------|---------------------|
INV_ApplicableTaxes列出适用的税金。
对于___Inventory
表中的每个项目,我将表___SalesTaxes
链接到知道巫婆税适用于该项目。
如何列出___Inventory
中的项目并将适用的税额加起来以得到类似的结果:
我已经尝试过的是:
SELECT
a.INV_ApplicableTaxes,
(
SELECT Count(b.STX_Amount)
FROM ___SalesTaxes
Where b.STX_Id = a.INV_ApplicableTaxes
) as b_count
FROM ___Inventory
谢谢。
您的数据结构非常糟糕。你不应该将1,2
存储在一个列中。为什么不?
存储它的正确方法是使用单独的itemTaxes
表,每个项目一行,每个适用的税收一行。
也就是说,有时我们会遇到其他人非常糟糕的设计决策而无法对此做任何事情(直到我们不得不表现糟糕)。
你可以用like
做你想做的事:
SELECT i.INV_ApplicableTaxes,
(SELECT SUM(st.STX_Amount)
FROM ___SalesTaxes st
WHERE ',' || st.STX_Id || ',' LIKE '%,' || i.INV_ApplicableTaxes || ',%'
) as sum_taxes
FROM ___Inventory i;
注意:这使用ANSI标准语法进行字符串连接。有些数据库有自己的语法。
编辑:
在MySQL中,您可以使用find_in_set()
表达:
SELECT i.INV_ApplicableTaxes,
(SELECT SUM(st.STX_Amount)
FROM ___SalesTaxes st
WHERE FIND_IN_SET(st.STX_Id, i.INV_ApplicableTaxes) > 0
) as sum_taxes
FROM ___Inventory i;
展望未来,对于数据库而言,这是一个值得怀疑的设计,迟早,缺乏1NF标准化可能会导致问题。
但是,如果不能更改数据库模式,则可以使用find_in_set
函数来帮助执行此连接:
SELECT i.*,
(SELECT SUM(s.stx_amount)
FROM ___SalesTaxes s
WHERE FIND_IN_SET(s.stx_id, i.inv_applicableTaxes) > 0
) AS total_tax
FROM ___Inventory i