来自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的主要内容,如果未能解决你的问题,请参考以下文章