Есть ли способ упростить этот следующий запрос MySQL? - PullRequest
0 голосов
/ 26 февраля 2011

Я предложил следующий запрос, чтобы получить данные о ценах на продукты.Этот запрос работает нормально, хотя мне интересно, есть ли способ упростить / оптимизировать его?

Запрос извлекает информацию о продукте и информацию о ценах для каждого продукта.Если для определенного продукта нет информации о ценах (p_p. pl_id = 2), присоединитесь к другому запросу с информацией о ценах (p_p. pl_id = 1).Наконец, сгруппируйте все товары по идентификатору, чтобы получить отдельные строки.

Используемые таблицы: products - некоторые сведения о продуктах, такие как название, описание и т. Д. product_pricing (p_p) -содержит информацию о ценах для каждого продукта.Может быть больше одной записи для одного продукта, потому что цена продукта варьируется в зависимости от заказанного количества

SELECT * FROM (
(
SELECT `products`.*, 
GROUP_CONCAT(p_p.`qty_range` SEPARATOR '|') AS qty_range, 
GROUP_CONCAT(CAST(p_p.`p_price` AS CHAR) SEPARATOR '|') AS price 
FROM `products`
LEFT JOIN `prod_pricing` AS p_p ON p_p.`prod_id` = `products`.`prod_id` 
WHERE `products`.`account_id` = 2
AND p_p.`pl_id` = 2
GROUP BY `products`.`prod_id`
) 
UNION
(
SELECT `products`.*, 
GROUP_CONCAT(p_p.`qty_range` SEPARATOR '|') AS qty_range, 
GROUP_CONCAT(CAST(p_p.`p_price` AS CHAR) SEPARATOR '|') AS price 
FROM `products`
LEFT JOIN `prod_pricing` AS p_p ON p_p.`prod_id` = `products`.`prod_id` 
WHERE `products`.`account_id` = 2
AND p_p.`pl_id` = 1
GROUP BY `products`.`prod_id`
)) AS list
GROUP BY list.`prod_id`

Ответы [ 3 ]

1 голос
/ 26 февраля 2011

Отредактировано: я думаю, я понял, что вы имеете в виду, попробуйте:

SELECT t.col1, t.col2,  --[more columns from products table]
IF (t.price2 IS NULL, t.price1, t.price2) AS price,
IF (t.price2 IS NULL, t.qty_range1, t.qty_range2) AS qty_range
FROM
    (
    SELECT p.col1, p.col2 , --[more columns from products table]
    GROUP_CONCAT(p_p1.qty_range SEPARATOR '|') AS qty_range1, 
    GROUP_CONCAT(CAST(p_p1.p_price AS CHAR) SEPARATOR '|') AS price1,
    GROUP_CONCAT(p_p2.qty_range SEPARATOR '|') AS qty_range2,
    GROUP_CONCAT(CAST(p_p2.p_price AS CHAR) SEPARATOR '|') AS price2 
    FROM products p
    LEFT JOIN prod_pricing AS p_p1 ON p_p1.prod_id = p.prod_id AND p_p1.pl_id = 1
    LEFT JOIN prod_pricing AS p_p2 ON p_p2.prod_id = p.prod_id AND p_p2.`pl_id` = 2
    GROUP BY p.prod_id) AS t
Having price IS NOT NULL
0 голосов
/ 02 марта 2011

Хорошо, я наконец понял это.Я создал две временные таблицы t1, t2, которые отражают данные с pl_id = 1 и 2. Затем я присоединил эти таблицы к таблице продуктов и с условием IF вернул продукты с ценами от pl_id = 2 и pl_id = 1 только при ценах для pl_id = 2не существуетСпасибо всем за помощь!

Вот запрос

SELECT p.*,
IF(t2.pl_id IS NULL,t1.qty_range,t2.qty_range) AS qty_range,
IF(t2.pl_id IS NULL,t1.price,t2.price) AS price
FROM products AS p
LEFT JOIN
(
    SELECT p_p.prod_id,
    GROUP_CONCAT(p_p.qty_range SEPARATOR '|') AS qty_range, 
    GROUP_CONCAT(CAST(p_p.p_price AS CHAR) SEPARATOR '|') AS price 
    FROM prod_pricing AS p_p WHERE p_p.pl_id = 1
    GROUP BY p_p.prod_id
) AS t1 ON t1.prod_id = p.prod_id
LEFT JOIN
(
    SELECT p_p.prod_id,p_p.pl_id,
    GROUP_CONCAT(p_p.qty_range SEPARATOR '|') AS qty_range, 
    GROUP_CONCAT(CAST(p_p.p_price AS CHAR) SEPARATOR '|') AS price 
    FROM prod_pricing AS p_p WHERE p_p.pl_id = 1
    GROUP BY p_p.prod_id
) AS t2 ON t2.prod_id = p.prod_id 
WHERE p.account_id = 2
0 голосов
/ 26 февраля 2011

Поскольку два СОЮЗА почти идентичны, возможно, вы могли бы взглянуть на СЛУЧАЙ

Вы могли бы иметь

WHERE `products`.`account_id` = 2
AND `products`.`prod_id`
AND CASE x
    WHEN y THEN
      p_p.`pl_id` = 2
    ELSE
      p_p.`pl_id` = 1

Хотя неясно, где и как вы определяете, есть ли информация о ценах. Но независимо от того, какой столбец определит, он будет использоваться для x , а его значение в y .

...