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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了来自MySQL中两个différents表的SELECT和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

谢谢。

答案

您的数据结构非常糟糕。你不应该将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;
另一答案

展望未来,对于数据库而言,这是一个值得怀疑的设计,迟早,缺乏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

以上是关于来自MySQL中两个différents表的SELECT和COUNT的主要内容,如果未能解决你的问题,请参考以下文章

来自两个不同表的Mysql计数和总和

来自多个表的 MySQL 最新相关记录

使用来自 2 个不同表的字段创建表

来自两个多对多表的MYSQL搜索查询优化

如何显示来自相关子查询的表的两个详细信息。 #mysql

查看mysql多个表的行数