Как добавить ещё одну выборку 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], пересобрать, почистить от дубликатов и выводить уже его?
  • Вопрос задан
  • 54 просмотра
Пригласить эксперта
Ответы на вопрос 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 дообработать выборку. На практике, обычно, смотрят что либо быстрее выполняется, либо меньше по памяти.
Ответ написан
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы