我正在使用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
感谢。
答案 0 :(得分:0)
您的数据结构非常糟糕。您不应将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;
答案 1 :(得分:0)
展望未来,对于数据库而言,这是一个值得怀疑的设计,迟早,缺乏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