2017-01-25 2 views
0

を検討してください:私は、MySQLデータベースMySQLのクエリは

について話しています私はこのような二つのテーブルがあります:私は探しています出力はこのようなものです

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  | 
+------------+----------+-------------+ 

を:

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

ご協力いただければ幸いです。

+0

それはあなたが後にしている、またはそれ以上の存在であり、二つの日付は一例であり、単に二つの日付ですか? – datavoredan

+0

私はちょうど最後の2つの日付が必要です(より多くのDBになるでしょう) –

+0

テーブルがより多くの日付を取得すると、あなたは常に最後の2つが必要ですか? – Linkan

答えて

1

このようなクエリで実行できます。テーブルの最新の2つの日付を検索してクエリを生成しますが、列名は修正されています。あなたもそれらを変更したい場合は、準備されたステートメントを使用する必要があります。

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; 

サンプル

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) 

テスト

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]>