LEFT JOIN создает несколько строк, GROUP BY или DISTINCT - PullRequest
0 голосов
/ 17 сентября 2018

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

Я пытался использовать DISTINCT и GROUP BY, ноон не ведет себя так, как я хочу.

SELECT
    s.id AS ShopID,
    s.name,
    si.id AS shop_item_id,
    si.item_price,
    p.cat_id AS category_id,
    c.campaign_desc,
    c.campaign_type_id,
    c.shop_id AS campaign_shop_id

FROM
    shop_item si 

    JOIN
        shop s ON 
        s.id = si.shop_id
    JOIN
         product p ON 
         si.product_id = p.id
    LEFT JOIN 
        campaign_category cc ON 
        cc.category_id = p.cat_id
    LEFT JOIN 
        campaign c ON 
        c.id = cc.campaign_id AND
        c.shop_id = si.shop_id
WHERE
    si.`product_id` = 299 AND
    s.`active_shop` = 1

ORDER BY
    si.`item_price`,
    ShopID,
    c.campaign_desc DESC

enter image description here

Но если я добавлю

GROUP BY ShopID 

, он вернет это

enter image description here

Так внезапно «Черная пятница» отсутствует в первом магазине «Магазин 1».Я также попробовал DISTINCT без какой-либо удачи, и сейчас я немного растерялся.Чего мне не хватает?

С наилучшими пожеланиями, Джон

1 Ответ

0 голосов
/ 17 сентября 2018

используйте group by cluase с максимальной агрегацией, так как значение вашего дублированного столбца дает нулевое значение для описания, campeign_id и shop_id, они могут быть обработаны с использованием max, но если вы поделитесь структурой таблицы, то будет легко определить, почему она производитдубликаты записей и что может быть лучшим решением

SELECT
    s.id AS ShopID,
    s.name,
    si.id AS shop_item_id,
    si.item_price,
    p.cat_id AS category_id,
    max(c.campaign_desc) as desc,
    max(c.campaign_type_id) as campaign_type_id,
    max(c.shop_id) AS campaign_shop_id

FROM
    shop_item si 

    JOIN
        shop s ON 
        s.id = si.shop_id
    JOIN
         product p ON 
         si.product_id = p.id
    LEFT JOIN 
        campaign_category cc ON 
        cc.category_id = p.cat_id
    LEFT JOIN 
        campaign c ON 
        c.id = cc.campaign_id AND
        c.shop_id = si.shop_id
WHERE
    si.`product_id` = 299 AND
    s.`active_shop` = 1
group by s.id,
    s.name,
    si.id ,
    si.item_price
ORDER BY
    si.`item_price`,
    ShopID,
    c.campaign_desc DESC
...