В настоящее время я разрабатываю фоновые cms для интернет-магазина.
Я разбил таблицы в своей базе данных следующим образом:
-произведения
-продукт-детали (descrition ...)
-productimages
Варианты продукции (цвета ..)
кросс-продажи
Теперь на странице редактирования продукта мне нужно получить все данные для одного продукта.
Поэтому мой вопрос заключается в том, как сделать эти детали более эффективными, чем совершать 3-5 вызовов в базу данных.
Или обработка с использованием php будет менее эффективной, чем выполнение этих 3-5 вызовов?
На данный момент запрос выглядит так:
SELECT
pr.id, pr.categorieid, pr.itemnumber, pr.barcode, pr.price, pr.weight, pr.gender, pr.manufracture, pr.fsk18, pr.condition, pc.id AS pcid, pc.productcrossid, pc.sort, pd.productname,
pd.productdesc, pd.additional, pd.linktitle, pd.metatitle, pd.metadesc, pd.urlkeywords, pi.id AS piid, pi.wichimage, pi.variantid, pi.image, pi.imagealt, pv.id AS pvid, pv.variant,
pv.variantvalue, pv.sku, pv.price AS pvprice, pv.weight AS pvweight, pv.stock, pv.special
FROM
products pr
LEFT JOIN
productcross as pc
ON pr.id = pc.productid
LEFT JOIN
productdetails as pd
ON pr.id = pd.productid
LEFT JOIN
productimage as pi
ON pr.id = pi.productid AND pd.lang = pi.lang
LEFT JOIN
productvariants as pv
ON pr.id = pv.productid
WHERE
pr.id = :id
ORDER BY pd.lang ASC
В результате я получаю много строк, так как из-за левого соединения каждое значение соединяется со строками, которые я ранее соединял.
Проблема в том, что существует множество строк для перекрестных продаж, вариантов, изображений, поэтому может быть случайным, если вариантов или изображений больше (иначе я мог бы сгруппировать их по крайней мере, потому что каждый вариант может получить свое изображение, но может быть также больше изображений, чем варианты)
Продукты 1 строка, productdetails в зависимости от того, сколько языков используется, наиболее вероятно 3.
Редактировать: Согласно Explain и заданным мною индексам производительность этого отдельного запроса очень хорошая.
Редактировать
По словам Пола Шпигеля, я попробовал использовать GROUP_CONCAT
SELECT
pr.id, pr.categorieid, pr.itemnumber, pr.barcode, pr.price, pr.weight, pr.gender, pr.manufracture, pr.fsk18, pr.condition, pc.id AS pcid, pc.productcrossid, pc.sort, pd.productname,
pd.productdesc, pd.additional, pd.linktitle, pd.metatitle, pd.metadesc, pd.urlkeywords
FROM
products pr
LEFT JOIN
productsdetails as pd
ON pr.id = pd.productid
LEFT JOIN (
SELECT
GROUP_CONCAT(productcrossid) AS pcproductcrossid, GROUP_CONCAT(sort) AS pcsort, GROUP_CONCAT(id) AS pcid, productid
FROM productscross
WHERE productid = :id
) pc
ON pr.id = pc.productid
WHERE
pr.id = :id
ORDER BY pd.lang ASC