POS应用程序-简化SQL多重查询(MySQL)

威尔逊·鲁尼兹(Wilson Luniz)

嗨,我正在使用MySQL开发POS应用程序。这是我的情况:

表“ purchased_item”

|    id    |    name    |    check_id    |    real_price    |
|    1     |   iPhone5  |      0001      |       399        |
|    2     |   iPhone4  |      0001      |       199        |
|    3     |   iPhone5s |      0002      |       599        |
|    4     |   iPhone5c |      0003      |       399        |
|    5     |   iMac 21" |      0003      |       999        |
|    6     | iPod Touch |      0003      |        99        |
|    7     |   iPhone5  |      0004      |       399        |
|    8     |   iPhone3G |      0004      |        99        |
|    9     |   iPhone6  |      0005      |       899        |
|    10    |  iPhone3Gs |      0005      |       101        |

而且我想知道有多少张支票的总数大于或等于qual(> =)1000,所以我现在要做的是多次查询。在此示例中,我做了5次并由主机程序手动求和。

后来数据增长了,查询变得缓慢了,因为每天要进行大量检查。因此,我更改为将其记录到另一个表中。

表“检查”

|    id    |    total    |    sales    |
|   0001   |     598     |      A      |
|   0002   |     599     |      A      |
|   0003   |     1497    |      B      |
|   0004   |     498     |      B      |
|   0005   |     1000    |      A      |

但是,以后还会出现另一个问题:当我需要调整“ purchased_item”表中的real_price时,我还需要维护“ checks”表中的“ total”列。听起来没什么大不了,但我想找到一种更好的方法来解决它。

解决了:

SELECT * FROM purchased_item
GROUP BY check_id
HAVING sum(real_price) >= 1000

结果将是:

|    id    |    name    |    check_id    |    real_price    |
|    4     |   iPhone5c |      0003      |       399        |
|    9     |   iPhone6  |      0005      |       899        |

进一步的问题:如果我想计算支票的总价,该怎么办?我找到了:

SELECT check_id,sum(real_price) FROM purchased_item
GROUP BY check_id
HAVING sum(real_price) >= 1000
术语

这样尝试

SELECT i.id, i.name, i.check_id, i.real_price
  FROM 
(
  SELECT MIN(id) id
    FROM purchased_item 
   GROUP BY check_id
  HAVING SUM(real_price) >= 1000
) q JOIN purchased_item i
    ON q.id = i.id
 ORDER BY q.id DESC

样本输出:

| ID | NAME | CHECK_ID | REAL_PRICE | 
| ---- | ------------ | ---------- || ------------ | 
| 9 | iPhone6 | 5 | 899 | 
| 4 | iPhone5c | 3 | 399 |

...我想算出总数超过1000张的支票

为此,您可以这样做

SELECT COUNT(*) total
  FROM
(
  SELECT check_id
    FROM purchased_item 
   GROUP BY check_id
  HAVING SUM(real_price) >= 1000
) q;

样本输出:

| 总计| 
| ------- | 
| 2 |

这是SQLFiddle演示


要更新totalchecks调整后real_pricepurchased_item

UPDATE checks c JOIN 
(
  SELECT check_id, SUM(real_price) total
    FROM purchased_item 
   WHERE check_id IN(5) -- whatever check(s)'s total you want to recalculate
   GROUP BY check_id
) p
    ON c.id = p.check_id
   SET c.total = p.total;

这是SQLFiddle演示

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章