我正在使用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;

10-05 19:30