inilim2
@inilim2
Intern PHP

Как избежать повтора в запросах многие ко многим?

Структура таблиц:
CREATE TABLE `template_link` (
  `template_id` int unsigned NOT NULL,
  `category_id` int unsigned NOT NULL,
  UNIQUE KEY `template_id` (`template_id`,`category_id`)
)

CREATE TABLE `template_category` (
  `category_id` int unsigned NOT NULL,
  `name` varchar(255)  NOT NULL,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`category_id`)
)

CREATE TABLE `template` (
  `template_id` int unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int unsigned NOT NULL,
  `flow_id` int unsigned NOT NULL,
  `status` int unsigned DEFAULT NULL,
  `name` varchar(255)  NOT NULL,
  `preview_url` varchar(255)  DEFAULT NULL,
  `structure` longtext,
  `last_structure` longtext,
  `created_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  `updated_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  PRIMARY KEY (`template_id`)
)

Запрос многие ко многим:
SELECT

    t.template_id,
    t.user_id,
    t.flow_id,
    t.status,
    t.name,
    t.preview_url,
    t.structure,
    t.last_structure,
    t.created_at as template_created_at,
    t.updated_at as template_updated_at,

    c.category_id,
    c.name as category_name,
    c.created_at as category_created_at,
    c.updated_at as category_updated_at

FROM `template` AS t

JOIN template_link AS tl
ON t.template_id = tl.template_id

JOIN template_category AS c
ON tl.category_id = c.category_id

Результат таковым (вывод как есть / ожидаю):
65845bcc38962399868118.jpeg
  • Вопрос задан
  • 91 просмотр
Пригласить эксперта
Ответы на вопрос 2
ThunderCat
@ThunderCat Куратор тега MySQL
{PHP, MySql, HTML, JS, CSS} developer
1280px-SQL_Joins.svg.png

UPD:
Ребят JOIN правильный, но так как у шаблона может быть несколько категорий, выборка идет с дублирующими "ЯЧЕЙКАМИ",
в вопросе идет речь про повторы (по умолчанию строк). Из картинок нифига не понятно чего вам не хватает.
Если нужно сделать строки уникальными по какому-либо полю, следует сгруппировать соответственно по этому полю, тогда эти строки "схлопнутся" до одной. Беда в том что тогда вы не будете знать какая категория попадет по умолчанию в результат запроса, и соответственно нужно либо использовать агрегирующие функции в списке полей, либо сортирующие. Как вариант можно использовать дистинкт на соответствующее поле.
Ответ написан
@rPman
Left join, оставит записи из левой части, где обычно базовая таблица, а справа подчинённые и справочники (если порядок другой то right join)
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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