商品の在庫管理をするシステムで一応問題なく動いてはいるのですが効率が悪いので改善を行いたく今回はご質問させていただきました。
商品リスト
|商品リストid|商品コード|商品名|在庫|サイズ|
|:--|:--:|--:|
|1| fruits01 |りんご|5|中|
|2| fruits01 |りんご|5|大|
|3| fruits02 |みかん|5|中|
|4| fruits03 |ぶどう|5|中|
仮押さえリスト
| id | 商品リストid |
|---|---|
| 1 | 2 |
| 2 | 3 |
| 3 | 3 |
| 4 | 1 |
| 5 | 3 |
| 6 | 3 |
| 7 | 3 |
| 8 | 1 |
| 9 | 1 |
| 10 | 1 |
| 11 | 1 |
上記のようなテーブルが二つ用意されています。
商品リストが商品の一覧となり仮押さえリストが商品リストIDに紐付いて一旦在庫を確保しています。
なので一旦確保され在庫が0になった場合は売り切れと表示を変更するようになっています。
ただサイズ違いは両方がなくならない限り在庫ありになります。
なので上記の結果としては
りんご在庫あり
みかん在庫なし
ぶどう在庫あり
となります。
希望の返り値は商品名、在庫で
| 商品名 | 在庫 |
|---|---|
| りんご | 4 |
| みかん | 0 |
| ぶどう | 5 |
となるのが理想です。
ですが現在はかなり無理矢理になっている気がしてもっと効率のいい方法があると思い今回質問させていただきました。
現在の状態は
sql
1SELECT 2 商品コード, 3 max(商品名) AS 商品名, 4 SUM(ifnull(在庫,0)) AS 在庫数 5FROM 6 商品リスト 7GROUP BY 8 商品コード
| 商品コード | 商品名 | 在庫 |
|---|---|---|
| fruits01 | りんご | 10 |
| fruits02 | みかん | 5 |
| fruits03 | ぶどう | 5 |
まず商品コードごとの在庫数を取得しています。
そのあとに仮押さえリストからCOUNTで取得します。
その際商品リストにJOINして商品コードを取得しています。
sql
1SELECT 2 T2.商品コード, 3 COUNT(*) AS cnt 4FROM 5 仮押さえリスト T1 6LEFT JOIN 7 商品リスト AS T2 8ON 9 T1.商品リストid = T2.商品リストid 10GROUP BY 11 T2.商品コード 12HAVING 13 (COUNT(*) > 0)
| 商品コード | 在庫 |
|---|---|
| fruits01 | 6 |
| fruits02 | 5 |
| fruits03 | 0 |
この二つのSQLをなげてそのあとに
商品コードをが紐付いているので単純にphpで引き算をして画面に表示させています。
もしSQLのみでできる方法があればご教授願いたいのですがよろしくお願いいたします。
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。