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

Как добавить ещё одну выборку SQL JOIN?

Доброго времени суток, уважаемые!
Имеется банальная галерея, собираемая из нескольких таблиц MySQL: Категория, Рисунки, Тэги.
Рисунки и Тэги, как "многие к многим", собираются через дополнительную таблицу images_tags
Таблицы

таблица category
| category_id | title   |
-------------------------
|     1       | люди    |

таблица images
 id |  name    | category_id |
 -----------------------------
 1  | Иван     |     1       |
 2  | Марья    |     1       |

таблица tags
id | tagname |
--------------
1  | человек |
2  | женщина |
3  | мужчина |

таблица images_tags
 id |  images_id   | tags_id     |
 ----------------- ---------------
 1  | 1 (Иван)     | 1 (человек) |
 2  | 2 (Марья)    | 1 (человек) |
 3  | 1 (Иван)     | 3 (мужчина) |
 4  | 2 (Марья)    | 2 (женщина) |

Выводится всё это через SQL INNER JOIN
$query = '
SELECT images.name,
 GROUP_CONCAT(tags.tagname SEPARATOR ", ") AS tagname,
 category.title
FROM images
INNER JOIN images_tags ON images.id = images_tags.images_id
INNER JOIN tags ON images_tags.tags_id = tags.id
INNER JOIN category ON images.category_id = category.category_id
WHERE images.category_id = 1
GROUP BY images.name
';
$query = $pdo->query($query);
$arrTable = $query->fetchAll(PDO::FETCH_ASSOC);

На выходе получаем массив $arrTable:
массив $arrTable
Array
(
  [0] => Array
    (
      [name] => Иван
      [tagname] => Человек, Мужчина
      [title] => Люди
    )

  [1] => Array
    (
      [name] => Марья
      [tagname] => Человек, Женщина
      [title] => Люди
    )
)

Но надо ещё получить список всех ТЭГОВ, из таблицы tags, соответствующий категории "Люди" (чтобы вывести на боковую панель "Облаком тегов" категории).
То есть дополнительно получить список:
Человек
Женщина
Мужчина


ВОПРОС: Как это сделать?
Создать ещё один запрос в tags.tagname?
Или взять полученный массив $arrTable вытащить оттуда $arrTable[tagname], пересобрать, почистить от дубликатов и выводить уже его?
  • Вопрос задан
  • 56 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 1
@alexalexes
Нужно подзапросом пройтись опять по той же структуре таблиц, и сгруппировать теги относительно категории.
Атрибут category_tagname покажет все теги, используемые в изображениях той же категории.
SELECT images.name,
 GROUP_CONCAT(tags.tagname SEPARATOR ", ") AS tagname,
 category.title,
 a.category_tagname
FROM images
INNER JOIN images_tags ON images.id = images_tags.images_id
INNER JOIN tags ON images_tags.tags_id = tags.id
INNER JOIN category ON images.category_id = category.category_id
---------------------
join (SELECT category.category_id,
                    GROUP_CONCAT(tags.tagname SEPARATOR ", ") AS category_tagname
          FROM images
              INNER JOIN images_tags ON images.id = images_tags.images_id
              INNER JOIN tags ON images_tags.tags_id = tags.id
              INNER JOIN category ON images.category_id = category.category_id
               GROUP BY category.category_id
) a on a.category_id = images.category_id
----------------------
WHERE images.category_id = 1
GROUP BY images.name, category.title, a.category_tagname

Или взять полученный массив $arrTable вытащить оттуда $arrTable[tagname], пересобрать, почистить от дубликатов и выводить уже его?

Можно и на стороне php дообработать выборку. На практике, обычно, смотрят что либо быстрее выполняется, либо меньше по памяти.
Ответ написан
Ваш ответ на вопрос

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

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