2011-10-05 11 views
6

私は価格を2つのテーブルに分けて、それらを(現在の価格 - 最終日の価格)を引いて、DESC形式でORDERしたいと考えています。私はそれが単一のMySQLコマンドを使用して行うことができるかどうか疑問に思っていた。MySQLテーブルの値を減算する

テーブル構造

Table 1 
id | Item Name | Date  | Price 
1 | alpha  | 2011-10-05 | 10 
2 | beta  | 2011-10-05 | 12 
3 | gamma  | 2011-10-05 | 14 

Table 2 
id | Item Name | Date  | Price 
1 | alpha  | 2011-10-04 | 8 
2 | beta  | 2011-10-04 | 10 
3 | gamma  | 2011-10-04 | 12 
4 | alpha  | 2011-10-03 | 4 
5 | beta  | 2011-10-03 | 6 
6 | gamma  | 2011-10-03 | 8 

答えて

5
SELECT 
table1.id, table1.`Item Name`, 
table1.`Date` AS CurrDate, table1.Price AS CurrPrice, 
table2.`Date` AS PrevDate, table2.Price AS PrevPrice, 
table1.Price - table2.Price AS Difference 
FROM table1 
LEFT JOIN table2 ON table1.id = table2.id AND table1.`Date` - INTERVAL 1 DAY = table2.`Date` 
ORDER BY Difference DESC 

私はLEFT JOINを使用してきた方法を除き、このクエリについての特別なものは何もありません。昨日のレコードの金利が利用できない場合、最後の3列にはNULLが含まれていると思います。出力:

id | Item Name | CurrDate | CurrPrice | PrevDate | PrevPrice | Difference 
2 | beta  | 2011-10-05 | 12  | 2011-10-04 | 10  | 2 
3 | gamma  | 2011-10-05 | 14  | 2011-10-04 | 12  | 2 
1 | alpha  | 2011-10-05 | 10  | 2011-10-04 | 8   | 2 
+0

works!thanks:D –

4
SELECT 
    a.price as price1 
    , IFNULL(b.price,'(no data)') as price2 
    , (a.price - IFNULL(b.price,0)) as difference 
FROM table1 a 
LEFT JOIN table2 b ON (a.`item name` = b.`item name`) 
GROUP BY a.`item name` 
HAVING IFNULL(b.`date`,'') = MAX(IFNULL(b.`date`,'') 

は、ここでそれがどのように動作するかです。

2つのテーブルからデータを選択します。テーブル1のすべてのデータとテーブル2の一致するデータ。
table2から一致するデータが見つからない場合は、欠落している行の代わりにnullの値を置き換えます。 left join

次にグループgroup by)と共にtable1.item nameに基づい行。
これは、アイテムごとに複数の行を結合します。
having節では、table2から最新の日付行のみを選択することでこれを修正しています。

テーブル1と一致するテーブル2のデータがない場合に対処するために、小さな修正がselecthavingの句に組み込まれています。

あなたのクエリは次のようになります。

SELECT 
    s.closing as price1 
    , IFNULL(sh.closing,'(no data)') as price2 
    , (s.closing - IFNULL(sh.closing,0)) as difference 
FROM stocks s 
LEFT JOIN stockhistory sh ON (s.symbol = sh.symbol) 
GROUP BY s.symbol 
HAVING IFNULL(sh.edate,'') = MAX(IFNULL(sh.edate,'') 
LIMIT 30 OFFSET 0; 
+0

コードのおかげで、それが将来的に有用であるように、あなたは少しもそれを説明することができれば、私は本当に感謝:) –

+0

私は、次のエラーを取得しています: #1064 - あなたは持っていますSQL構文のエラー。あなたのMySQLサーバのバージョンに対応するマニュアルをチェックしてください。正しい構文は2行目の 'LIMIT 0、30'の近くで使用してください。 –

+0

@SaadBashir、私のクエリには 'limit'がありません。ちょっと見てみます。 (BTW 'limit 30 offset 0'はクエリの** last **ステートメントで、select句の一部ではありません) – Johan