Mysql дублированный идентификатор - PullRequest
0 голосов
/ 11 апреля 2020

Мне нужно взять некоторые данные из базы данных, но выбрать иногда дубликат идентификатора. Эта проблема из-за внутреннего соединения, но я не могу ее решить. Проблема существует только тогда, когда продукт имеет более одного изображения. Кто-нибудь знает как это решить?

SELECT DISTINCT
    ps_product_lang.id_product as id_product,
    ps_product_lang.name as title_product,
    ps_product_lang.description as product_description,
    ps_image.id_image as id_image
FROM
    ps_product_lang
INNER JOIN ps_image
    ON ps_product_lang.id_product = ps_image.id_product
ORDER BY ps_product_lang.id_product ASC

1 Ответ

0 голосов
/ 11 апреля 2020

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

Поскольку вы хотите получить одну строку на ps_product_lang, вы должны решить, как агрегировать дату из ps_image стол. Например, вы можете использовать метод GROUP_CONCAT с GROUP BY. Таким образом, ваш запрос может выглядеть следующим образом:

SELECT
    ps_product_lang.id_product as id_product,
    ps_product_lang.name as title_product,
    ps_product_lang.description as product_description,
    GROUP_CONCAT(ps_image.id_image) as id_images
FROM
    ps_product_lang
INNER JOIN ps_image
    ON ps_product_lang.id_product = ps_image.id_product
GROUP BY 
    -- all not aggregated field must be appears here
    ps_product_lang.id_product,
    ps_product_lang.name,
    ps_product_lang.description
ORDER BY ps_product_lang.id_product ASC;

Другим способом является объединение уже агрегированной таблицы:

SELECT
    ps_product_lang.id_product as id_product,
    ps_product_lang.name as title_product,
    ps_product_lang.description as product_description,
    groupped_images.id_images
FROM
    ps_product_lang
INNER JOIN (
    SELECT
        id_product,
        GROUP_CONCAT(ps_image.id_image) AS id_images
    FROM ps_image
    GROUP BY ps_image.id_product
) groupped_images
    ON ps_product_lang.id_product = groupped_images.id_product
ORDER BY ps_product_lang.id_product ASC;

В обоих случаях вам не нужно использовать ключевое слово DISTINCT. Уникальность строк решается правильной группировкой. Оператор GROUP_CONCAT можно изменить с помощью другой функции агрегирования :

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...