Как посчитать дубликаты по нескольким записям в подтаблице в MySQL - PullRequest
0 голосов
/ 14 ноября 2018

Скажите, у меня есть следующая структура таблицы:

products
id | name | price

products_ean
id | product_id | ean

Продукт может (к сожалению) иметь несколько номеров EAN. Два продукта могут иметь один или несколько одинаковых номеров EAN.

Какова лучшая практика для подсчета количества дублирующихся продуктов путем сравнения нескольких номеров EAN из таблицы products_ean?

Я пробовал что-то вроде следующего, но это действительно замедляет запрос:

SELECT
`products`.`name`,
(
SELECT
  COUNT(*)
FROM
  `products_ean`
WHERE
  `ean` IN(
  SELECT
    `ean`
  FROM
    `products_ean`
  WHERE
    `product_id` = `products`.`id`
) AND `products_ean`.`product_id` != `products`.`id`
GROUP BY `product_id`
) AS `ProductEANCount`
FROM
`products`
LIMIT 12

1 Ответ

0 голосов
/ 14 ноября 2018

Использование объединений - это самый простой способ создания связанной информации. У меня есть GROUP BY product.id, что означает, что eans - это агрегированное поле, потому что это единственные поля, которые могут дублироваться. Я добавил HAVING часть после запроса, чтобы выбрать только те результаты с 2 или более (это необязательно).

SELECT p.id, name, price, count(ean) as eans
FROM products p
JOIN products_ean e
  ON p.id = e.product_id
GROUP BY p.id
HAVING eans >= 2

В отношении эффективности запросов использование product_id, ean в качестве составного первичного ключа для таблицы products_ean, вероятно, наиболее эффективно. Поскольку это уникально, не очевидно, зачем нужен столбец products_ean.id.

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