#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 /