Сохранение возвращенных записей из mysql уникальными

#mysql #left-join

#mysql #левое соединение

Вопрос:

Есть ли быстрый способ убедиться, что записи, которые вы возвращаете из запроса соединения MySQL, уникальны?

Приведенный ниже код потенциально может вернуть одну и ту же категорию дважды. Это идентификатор категории, который должен быть отличным!

 SELECT 
   exp_categories.cat_name, exp_categories.cat_id, exp_categories.cat_url_title
  ,exp_category_posts.entry_id, exp_channel_titles.status 
FROM (exp_categories 
LEFT JOIN exp_category_posts 
       ON exp_categories.cat_id = exp_category_posts.cat_id) 
LEFT JOIN exp_channel_titles 
       ON exp_category_posts.entry_id = exp_channel_titles.entry_id 
WHERE exp_categories.group_id = 2 
  AND exp_category_posts.entry_id IS NOT NULL 
  AND exp_channel_titles.status = 'open' 
ORDER BY RAND() 
LIMIT 2
  

Ответ №1:

Если я понимаю, что вам нужно, вы могли бы закрыть свой запрос с:

 GROUP BY exp_categories.cat_id
ORDER BY RAND() 
LIMIT 2
  

Ответ №2:

Проблема здесь в том, что вы соединяете один ко многим, поэтому вы увидите столько строк, сколько записей в таблице «много». Если вы хотите вернуть только одну строку для каждой категории, вам нужно либо запросить только категории, либо решить, какие критерии вы хотите использовать для выбора отдельных значений из exp_category_posts.

Одним из вариантов примера является запрос самой последней записи в категории и объединение в этом результирующем наборе вместо exp_category_posts.

Ответ №3:

     SELECT 
   exp_categories.cat_name, exp_categories.cat_id, exp_categories.cat_url_title
  ,exp_category_posts.entry_id, exp_channel_titles.status 
FROM (exp_categories 
LEFT JOIN exp_category_posts 
       ON exp_categories.cat_id = exp_category_posts.cat_id) 
LEFT JOIN exp_channel_titles 
       ON exp_category_posts.entry_id = exp_channel_titles.entry_id 
WHERE exp_categories.group_id = 2 
  AND exp_category_posts.entry_id IS NOT NULL 
  AND exp_channel_titles.status = 'open' 
  GROUP BY exp_categories.cat_id
ORDER BY RAND() 
LIMIT 2
  

редактировать: Добавление столбца, который вы хотите выделить в предложении GROUP BY, гарантирует, что будет возвращен только 1. Кроме того, ПОРЯДОК С ПОМОЩЬЮ RAND() сильно не рекомендуется, см.:http://www.titov.net/2005/09/21/do-not-use-order-by-rand-or-how-to-get-random-rows-from-table /