简体   繁体   中英

MySql query in same column for different date

Please consider: I am talking about MySQL Database

I have two tables like this:

tbl_stock_info
+-----+--------+
| sId | sName  |
+-----+--------+
|   1 | Apple  |
|   2 | Google |
|   3 | Yahoo  |
+-----+--------+

tbl_stock_data
+------------+----------+-------------+
|    date    | stock_id | stock_price |
+------------+----------+-------------+
| 2017-01-25 |        1 | 44.7        |
| 2017-01-25 |        3 | 51          |
| 2017-01-25 |        2 | 71.5        |
| 2017-01-24 |        1 | 44.9        |
| 2017-01-24 |        3 | 51.2        |
| 2017-01-24 |        2 | 71.3        |
+------------+----------+-------------+

The Output I am looking for is like this:

+-----+--------+----------+----------+
| sId | sName  | Price_25 | Price_24 |
+-----+--------+----------+----------+
|   1 | Apple  | 44.7     | 44.9     |
|   2 | Google | 71.5     | 71.3     |
|   3 | Yahoo  | 51       | 51.2     |
+-----+--------+----------+----------+

Any assistance would be greatly appreciated.

You can do it with a query like this. it search the newest 2 dates in the table and generate your query, but the column name are fix. if you want also to change them you must use a prepared statement.

SELECT 
    si.*
    ,SUM(if(sd1.`date` = ( SELECT DISTINCT `date` FROM tbl_stock_data ORDER BY `date` DESC LIMIT 0,1), sd1.stock_price ,0)  ) as lastday
    ,SUM(if(sd1.`date` = ( SELECT DISTINCT `date` FROM tbl_stock_data ORDER BY `date` DESC LIMIT 1,1), sd1.stock_price ,0)  ) as daybefore
FROM tbl_stock_info si
LEFT JOIN tbl_stock_data sd1 ON sd1.stockid = si.sId
GROUP BY si.sId;

sample

MariaDB [l]> SELECT * FROM tbl_stock_info;
+-----+--------+
| sId | sNAme  |
+-----+--------+
|   1 | Apple  |
|   2 | Google |
|   3 | Yahoo  |
+-----+--------+
3 rows in set (0.00 sec)

MariaDB [l]> SELECT * FROM tbl_stock_data;
+----+------------+---------+-------------+
| id | date       | stockid | stock_price |
+----+------------+---------+-------------+
|  1 | 2017-01-25 |       1 | 44.70       |
|  2 | 2017-01-25 |       3 | 51.00       |
|  3 | 2017-01-25 |       2 | 71.50       |
|  4 | 2017-01-24 |       1 | 44.90       |
|  5 | 2017-01-24 |       3 | 51.20       |
|  6 | 2017-01-24 |       2 | 71.30       |
|  7 | 2017-01-23 |       1 | 99.00       |
|  8 | 2017-01-22 |       2 | 22.00       |
|  9 | 2017-01-20 |       3 | 33.13       |
+----+------------+---------+-------------+
9 rows in set (0.01 sec)

test

MariaDB [l]> SELECT
    ->     si.*
    ->     ,SUM(if(sd1.`date` = ( SELECT DISTINCT `date` FROM tbl_stock_data ORDER BY `date` DESC LIMIT 0,1), sd1.stock_price ,0)  ) as lastday
    ->     ,SUM(if(sd1.`date` = ( SELECT DISTINCT `date` FROM tbl_stock_data ORDER BY `date` DESC LIMIT 1,1), sd1.stock_price ,0)  ) as daybefore
    -> FROM tbl_stock_info si
    -> LEFT JOIN tbl_stock_data sd1 ON sd1.stockid = si.sId
    -> GROUP BY si.sId;
+-----+--------+---------+-----------+
| sId | sNAme  | lastday | daybefore |
+-----+--------+---------+-----------+
|   1 | Apple  | 44.70   | 44.90     |
|   2 | Google | 71.50   | 71.30     |
|   3 | Yahoo  | 51.00   | 51.20     |
+-----+--------+---------+-----------+
3 rows in set (0.00 sec)

MariaDB [l]>

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM