Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

Mysql issue in subquery

I have two mysql tables named item and stock.

select * From stock;
+----------+----------+-------+---------+-------------------+---------------+
| stock_id | qty_type | qty   | item_id | stock_location_id | stock_type_id |
+----------+----------+-------+---------+-------------------+---------------+
|       48 | v        | 44.00 |       1 |                 1 |             1 |
|       49 | v        |  8.00 |     263 |                 1 |             1 |
|       50 | a        |  6.00 |       1 |                 1 |             1 |
|       51 | a        |  4.00 |     263 |                 1 |             1 |
|       56 | a        | 21.00 |       1 |                 1 |             1 |
|       57 | a        | 57.00 |     263 |                 1 |             1 |
|       58 | a        |  6.00 |     264 |                 1 |             1 |
|       59 | a        | 19.00 |     301 |                 1 |             1 |
+----------+----------+-------+---------+-------------------+---------------+

Now I want to get all the items from item table along with all available qty from stock table.

This is how I tried it. But I coundn’t get correct qty from stock table.

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

SELECT i.item_id
     , i.item_name
     , i.item_code
     , i.sku
     , i.min_qty 
     , i.max_qty   
     , sum(current_stock) as stock
  FROM item i 
      LEFT JOIN (
         SELECT item_id, qty_type, COALESCE(SUM(qty),0) AS current_stock 
           FROM stock 
       GROUP BY item_id
                ) s USING(item_id)
  WHERE s.qty_type = 'a';

Result from above query

+---------+------------------+-----------+------------+---------+---------+-------+
| item_id | item_name        | item_code | sku        | min_qty | max_qty | stock |
+---------+------------------+-----------+------------+---------+---------+-------+
|     264 | HONE CLIP RUBER  | MM-00264  | NOOR-00264 |      10 |      20 | 25.00 |
+---------+------------------+-----------+------------+---------+---------+-------+
1 row in set (0.001 sec)

You can see, I can’t get all item records and that stock value also wrong with my qurery.

Can I know what I did wrong in my query?

>Solution :

Move the condition qty_type = 'a' inside the subquery and use COALESCE() in the main query so that you get 0 for items that do not match the join:

SELECT i.*,   
       COALESCE(s.current_stock, 0) AS stock
FROM item i 
LEFT JOIN (
  SELECT item_id, SUM(qty) AS current_stock 
  FROM stock
  WHERE qty_type = 'a' 
  GROUP BY item_id
) s USING(item_id);

The aggregation is needed only in the subquery.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading