I created a database for a clothing brand. The products consists of 3 tables: products, product_photos, inventory.
The issue I’m having pertains to the amount of results in the product_photos, inventory tables that are returned. So say there should be 4 results in the inventory table (ex. size: s, m, l, xl AND quantity: 20, 20, 20, 20) and 1 result in the product_photos table (ex. photos: url). With my current query the product_photos data is duplicated 4 times (ex. photos: url, url, url, url).
My current query looks like this:
SELECT products.id, products.type, products.collection, products.title, products.price, products.thumbnail, GROUP_CONCAT(product_photos.id) AS photoId, GROUP_CONCAT(product_photos.photo) AS photos, GROUP_CONCAT(inventory.size) AS size, GROUP_CONCAT(inventory.quantity) as quantity FROM `products` RIGHT JOIN `product_photos` ON products.id = product_photos.product_id RIGHT JOIN `inventory` ON products.id = inventory.product_id WHERE products.id = ? GROUP BY products.id
I have played around with some things such as changing the right’s to inner join’s and left join’s but right join seems to be the technical choice for what I’m trying to do.
Here is some sample data:
product: id: 1 product_photo: id: 1, product_id: 1, photo: url inventory: id: 1, product_id: 1, size: s, quantity: 20 id: 2, product_id: 1, size: l, quantity: 14
Advertisement
Answer
The reason for the many results is that both the product_photos as and the inventory table can have multiple records for the same product_id and so all pairwise combinations of records from both tables will be iterated (Cartesian product).
You can solve this by first selecting all records from both these tables with a union and then join that result with the products table:
SELECT products.id,
products.type,
products.collection,
products.title,
products.price,
products.thumbnail,
GROUP_CONCAT(photoId) AS photoId,
GROUP_CONCAT(photos) AS photos,
GROUP_CONCAT(size) AS size,
GROUP_CONCAT(quantity) as quantity
FROM products
LEFT JOIN (
SELECT product_id,
id AS photoId,
photo AS photos,
null AS size,
null AS quantity
FROM product_photos
UNION
SELECT product_id,
null,
null,
size,
quantity
FROM inventory
) combi
ON products.product_id = combi.product_id
WHERE products.id = ?
GROUP BY products.id