MySQL SELECT Дублированные строки из базы данных OpenCarts - PullRequest
2 голосов
/ 15 февраля 2011

Просто играю с OpenCarts DB, чтобы посмотреть, смогу ли я чему-то научиться. Если я использую следующее SELECT , результат возвращает дублированные строки:

SELECT DISTINCT
p.product_id AS pid,
p.model AS modelo,
SUBSTRING(p.model,1,25) AS substr_modelo,
p.image AS foto,
p.price AS preco,
pd.name AS nome,
cd.name AS category
FROM product p
LEFT JOIN product_description pd ON p.product_id = pd.product_id
LEFT JOIN product_to_category p2c ON p.product_id = p2c.product_id
LEFT JOIN category_description cd ON p2c.category_id = cd.category_id
WHERE pd.name LIKE _utf8 'laser%' collate utf8_unicode_ci
ORDER BY p.product_id DESC

Обратите внимание, что даже при использовании DISTINCT он дублируется, но если я добавлю GROUP BY p.product_id , он прекращает дублирование строк. Это лучшее решение?

1 Ответ

0 голосов
/ 15 февраля 2011

DISTINCT удаляет дубликаты целых строк .

Используйте GROUP BY p.product_id, чтобы отобразить одну 1 строку для идентификатора продукта.

Примечание. Если вы группируете по product_id, если у вас есть несколько описаний продуктов, несколько категорий или несколько описаний категорий, запрос будет возвращать случайную строку для каждого. Используйте функции MIN() или MAX() для получения отдельных идентификаторов или используйте функцию GROUP_CONCAT() для получения всего описания.

Пример

SELECT
  p.product_id AS pid,
  p.model AS modelo,
  SUBSTRING(p.model,1,25) AS substr_modelo,
  p.image AS foto,
  p.price AS preco,
  GROUP_CONCAT(pd.name) AS nome,
  GROUP_CONCAT(cd.name) AS category
FROM product p
  LEFT JOIN product_description pd ON p.product_id = pd.product_id
  LEFT JOIN product_to_category p2c ON p.product_id = p2c.product_id
  LEFT JOIN category_description cd ON p2c.category_id = cd.category_id
  WHERE pd.name LIKE _utf8 'laser%' collate utf8_unicode_ci
GROUP BY p.product_id
ORDER BY p.product_id DESC
...