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

问题描述 投票:0回答:2

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

谢谢。

mysql sql count
2个回答
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;

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
© www.soinside.com 2019 - 2024. All rights reserved.