php - 我可以在mysql中使用if语句吗?

标签 php mysql codeigniter

我正在尝试创建一个查询,该查询将根据价格生成他们的总使用量。我不知道这是否可能在查询中,所以在这里。

主表//这个表是全民的,所以这个是连续的,这个可以加,id列是唯一的。

 id          price       date_created
 25           8.5         2019-08-16
 26           11.5        2019-08-01

electricity table//这个表是连续的基于main_id的,只要main_id存在于Main table每天这个usage表就会有它的日常主表中存在的所有 main_id 的值。这就像为他们的日常使用而产生的电力。

id    main_id           current_usage  date_generated
1         25                10         2019-08-16     
2         25                10         2019-08-17
3         25                10         2019-08-18
4         25                10         2019-08-19
5         25                10         2019-08-20
6         25                10         2019-08-21
7         26                20         2019-08-01
8         26                 5         2019-08-02
9         26                 5         2019-08-03
10        26                10         2019-08-04

我的查询

SELECT main.id
     , main.price
     , SUM(electricity.current_usage)*main.price total_generated
     , electricity.date_generated
  FROM main AS main
 INNER JOIN electricity AS electricity
    ON main.id = electricity.main_id
 GROUP 
    BY MONTH(electricity.date_generated);

在这里我没有问题,因为我想在这里得到的只是一对一。

所以输出将是

id             price        total_genereated
25              8.5              510
26              11.5             460   

这就是我的问题所在,这就是我卡住的地方

有一个 price_history 表,这个表的目的是,Main table 中那个 main_id 的价格可以随时改变。

id  main_id    changed_price            price_date_changed
1      25             15                    2019-08-18
2      26             20                    2019-08-03

而不是只得到两行。由于价格历史,我需要在这里有 4 行。价格变了。

示例输出

id             price        total_genereated          date_range
25              8.5              170            2019-08-16 - 2019-08-17
25              15               600            2019-08-18 - 2019-08-21 
26              11.5             287            2019-08-01 - 2019-08-02
26              20               300            2019-08-03 - 2019-08-04    

我不知道我的想法是否真的可以仅仅通过查询来实现,我真的被这个问题困住了。我在想的是在 MYSQL 中使用 IF 语句,或者这只是在查询中执行复杂操作的方法?

最佳答案

SQL DEMO

首先,您需要将所有价格放在一起:

SELECT id as main_id, price, date_created
FROM main

UNION

SELECT main_id, changed_price, price_date_changed
FROM price_history
ORDER BY main_id, date_created;

输出

| main_id | price | date_created |
|---------|-------|--------------|
|      25 |     9 |   2019-08-16 |
|      25 |    15 |   2019-08-18 |
|      26 |    12 |   2019-08-01 |
|      26 |    20 |   2019-08-03 |

现在使用相关子查询找到最新价格:

SELECT id, main_id, current_usage, date_generated,
       ( SELECT price
         FROM ( SELECT id as main_id, price, date_created
                FROM main
                UNION
                SELECT main_id, changed_price, price_date_changed
                FROM price_history
              ) prices
         WHERE prices.main_id = electricity.main_id
           AND prices.date_created <= electricity.date_generated
         ORDER BY prices.date_created DESC
         LIMIT 1 ) as price
FROM electricity
ORDER BY main_id, date_generated;   

输出

| id | main_id | current_usage | date_generated | price |
|----|---------|---------------|----------------|-------|
|  1 |      25 |            10 |     2019-08-16 |     9 |
|  2 |      25 |            10 |     2019-08-17 |     9 |
|  3 |      25 |            10 |     2019-08-18 |    15 |
|  4 |      25 |            10 |     2019-08-19 |    15 |
|  5 |      25 |            10 |     2019-08-20 |    15 |
|  6 |      25 |            10 |     2019-08-21 |    15 |
|  7 |      26 |            20 |     2019-08-01 |    12 |
|  8 |      26 |             5 |     2019-08-02 |    12 |
|  9 |      26 |             5 |     2019-08-03 |    20 |
| 10 |      26 |            10 |     2019-08-04 |    20 |

关于php - 我可以在mysql中使用if语句吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58162966/

相关文章:

php - 从帮助中选择 *

php - 使用 "JOIN"、 "WHERE"和 "IN"(mysql+php)

mysql - Codeigniter 对两个需要嵌套循环的表进行 1-many db 查询

php - CodeIgniter PHP Apache 500 内部服务器错误

mysql - sql内连接超过2个表和聚合函数

php - Codeigniter 临时存储文件

php - 验证 reCaptcha V2 : Always false

php - 递归函数逻辑问题

javascript - api 响应返回 "↵"

mysql - 使用名称和最大 View 花费的时间进行查询