来自MySQL中两个différents表的SELECT和COUNT

时间:2018-03-02 20:51:26

标签: mysql sql count

我正在使用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中的项目并将适用的税金加起来以达到以下目的:

  • 自行车 - 适用的税额为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

感谢。

2 个答案:

答案 0 :(得分:0)

您的数据结构非常糟糕。您不应将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;

答案 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