Задать вопрос

Как выбрать уникальные значения из Двух связанных таблиц?

Всем привет.
Мультиязычный сайт Laravel две таблицы categories и category_descriptions
Структура
CREATE TABLE `blog_categories` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `parent_id` bigint(20) UNSIGNED NOT NULL DEFAULT '0',
  `show_menu` enum('Y','N') COLLATE utf8mb4_unicode_ci NOT NULL,
  `show` enum('Y','N') COLLATE utf8mb4_unicode_ci NOT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

CREATE TABLE `blog_category_descriptions` (
  `id` bigint(20) UNSIGNED NOT NULL,
  `lang` char(3) COLLATE utf8mb4_unicode_ci NOT NULL,
  `category_id` bigint(20) UNSIGNED NOT NULL,
  `name` char(220) COLLATE utf8mb4_unicode_ci NOT NULL,
  `description` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `keywords` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `text` text COLLATE utf8mb4_unicode_ci NOT NULL,
  `slug` varchar(220) COLLATE utf8mb4_unicode_ci NOT NULL,
  `deleted_at` timestamp NULL DEFAULT NULL,
  `created_at` timestamp NULL DEFAULT NULL,
  `updated_at` timestamp NULL DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

Связаны по ключу id = category_id

Вот не получается выбрать из бд значения категории и родительской категории
Пробывал использовать Eloquent что то типа
$results = $this->startConditions()
            ->select($columns)
            ->with([
                'blogCategory:id,parent_id,show,show_menu,created_at'
            ])
            ->take($count)
            ->get();

И сыррые данные
$rows =DB::select('SELECT bc.id, 
                                        bc.parent_id, 
                                        bc.show_menu, 
                                        bc.show, 
                                        bc.created_at, 
                                        bc.updated_at,
                                        bcd.lang AS lang_bcd,
                                        bcd.category_id,
                                        bcd2.category_id AS cat_id_bcd2,
                                        bcd.name AS name_bcd,
                                        bcd2.name AS name_bcd2
                                FROM blog_categories bc 
                                LEFT JOIN blog_category_descriptions bcd ON (bcd.category_id = bc.id)
                                LEFT JOIN blog_category_descriptions bcd2 ON (bcd2.category_id = bc.parent_id)
                                ORDER BY bc.created_at 
                                DESC limit ?', [$count]);

с сырыми все выбирается однако получаются дубли.

Можете подсказать правильный способ такой выборки или куда копать. Или как выбрать уникальные сырые данные.
Спасибо
  • Вопрос задан
  • 132 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 2
@dimoff66
Кратко о себе: Я есть
Дубли могут получиться только в одном случае: если в blog_category_descriptions есть более одной записи с одинаковыми category_id.

Вы соединяете таблицы с отношением одна к многим, причём соединяете дважды, соответственно соединения по id перемножатся с соединениями по parent id. Если для id и parent id у вас по две записи в дескрипшинз, то на выходе вы получите четыре записи. Выход делать через union all. Первую таблицу соединяете по id затем union all и соединение той же таблицы по parent id.
Ответ написан
dimonchik2013
@dimonchik2013
non progredi est regredi
distinct там никак не канает?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы