Неизвестный столбец с LEFT JOIN и обычным JOIN - PullRequest
0 голосов
/ 15 сентября 2018

Прошло некоторое время с тех пор, как я сделал какой-либо SQL-запрос, и в настоящее время я пытаюсь ЛЕВО присоединить некоторые таблицы к моему старому запросу JOIN, чтобы иметь возможность получить определенные данные.

Однако я получаю «Неизвестный столбец« a.shop_id 'i on clause », и я не уверен, почему« a.shop_id »неизвестен.

SELECT
    e.campaign_desc,
    e.campaign_type_id,
    e.shop_id AS campaign_shop_id,
    a.*,
    b.*,
    a.id AS shop_item_id,
    c.cat_id AS category_id
FROM
    `shop_item` a, 
    `shop` b,
    `product` c
LEFT JOIN 
    `campaign_category` d ON 
            d.category_id = c.cat_id
LEFT JOIN 
    `campaign` e ON
            e.`id` = d.`campaign_id` 
        AND e.`shop_id` = a.`shop_id`
WHERE
    a.`product_id` = 23 AND
    b.`id` = a.`shop_id` AND
    b.`active_shop` = 1 AND
    a.`product_id`= c.`id` 
ORDER BY
    a.`item_price` DESC,
    a.`shop_id`

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

SELECT
    a.*,
    a.shop_id,
    b.*,
    a.id AS shop_item_id,
    c.cat_id AS category_id,
    (SELECT t2.campaign_desc 
        FROM 
            campaign_category t1, campaign t2 
        WHERE 
            t1.category_id = c.cat_id AND
            t2.id = t1.campaign_id AND
            t2.shop_id = a.`shop_id`
    )AS Campaigndata
FROM
    `shop_item` a, 
    `shop` b,
    `product` c
WHERE
    a.`product_id` = 23 AND
    b.`id` = a.`shop_id` AND
    b.`active_shop` = 1 AND
    a.`product_id`= c.`id` 
ORDER BY
    a.`item_price` DESC,
    a.`shop_id`

Чего мне не хватает в первом запросе?Помощь будет высоко ценится.

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

1 Ответ

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

Никогда не используйте запятые в предложении FROM. Всегда используйте правильный, явный стандартный JOIN синтаксис.

Итак, перефразируйте запрос следующим образом:

SELECT . . . 
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 
        c.shop_id = si.shop_id
WHERE si.product_id = 23 AND
      s.active_shop = 1
. . . 

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

Проблема с вашим запросом заключается в том, что , влияет на область применения используемых идентификаторов.Это действительно не важно понимать, потому что более важный момент заключается в том, чтобы всегда использовал правильный, явный, стандартный JOIN синтаксис .

...