Search code examples
phpmysqlproductvariants

Get products and their variants


i need help please with one query. I need a query that get products or variations from tables. So, if i needs products "a", "b" + variation of product "a1". How will the looks query? I need get three products from tables and to the last product (with ID: a) and replace with modifed values (price, weight, sales)

Here is example of tables and rows:

products
------------------
CREATE TABLE IF NOT EXISTS `products` (
  `id` varchar(10) NOT NULL,
  `hidden` tinyint(1) NOT NULL,
  `only_variations` int(1) NOT NULL DEFAULT '0',
  `price` decimal(20,6) NOT NULL,
  `weight_in_package` int(11) NOT NULL COMMENT 'mg',
  `stock_pieces` int(11) NOT NULL,
  `gifts` text NOT NULL,
  `rating` int(11) NOT NULL,
  `sold_pieces` int(11) NOT NULL,
  `brand` int(11) NOT NULL,
  `deleted` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

INSERT INTO `products` (`id`, `hidden`, `only_variations`, `price`, `weight_in_package`, `stock_pieces`, `gifts`, `rating`, `sold_pieces`, `brand`, `deleted`) VALUES
('a', 0, 0, 12.000000, 50, 10, '', 0, 35, 1, 0),
('b', 0, 0, 11.000000, 50, 15, '', 0, 22, 2, 0);


variations
------


CREATE TABLE IF NOT EXISTS `product_variations` (
  `id` varchar(10) COLLATE utf8_bin NOT NULL,
  `product` varchar(10) COLLATE utf8_bin NOT NULL,
  `price` decimal(20,6) NOT NULL,
  `stock_pieces` int(11) NOT NULL,
  `weight` int(11) NOT NULL COMMENT 'mg',
  `sales` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin;


INSERT INTO `product_variations` (`id`, `product`, `price`, `stock_pieces`, `weight`, `sales`) VALUES
('a1', 'a', 50.000000, 10, 0, 0),
('a2', 'a', 40.000000, 11, 0, 0);

And this output i needs in sql query:

id | price | variation
a     12      NULL
b     11      NULL
a     50      a1

THANKS VERY MUCH FOR ANY HELP!


Solution

  • Try this: http://sqlfiddle.com/#!9/0f128/44/0

    SELECT 
    *,
    null as `variation`
    FROM `products` WHERE id IN('a', 'b')
    
    UNION ALL
    
    (SELECT 
    
    p.id as `id`,
     p.hidden as `hidden`,
     p.only_variations as `only_variations`,
     v.price as `price`,
     p.weight_in_package as `weight_in_package`,
     v.stock_pieces as `stock_pieces`,
     p.gifts as `gifts`,
     p.rating as `rating`,
     p.sold_pieces as `sold_pieces`,
     p.brand as `brand`,
     p.deleted as `deleted`,
     v.id as `variation`
    
     FROM `product_variations` as v
    
    
    
    LEFT JOIN `products` as p ON p.id = v.product 
    
     WHERE v.id IN('a1'))
     ORDER BY price DESC