我正在使用phpMyAdmin,并且有两个SQL表:
___销售税
|--------|----------|------------|
| 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
中列出项目并汇总适用税款,使之类似于以下内容:自行车-适用税金为5.00%
电影-适用税金为18.50%
我已经尝试过的是:
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
存储在单个列中。为什么不?
整数应存储为整数,而不是字符串。
外键关系应正确声明。
SQL具有相对较差的字符串处理功能。
SQL优化器无法很好地优化字符串操作,尤其是在表之间。
正确的存储方式是使用单独的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;