@DESTEQ

Вывод данных из нескольких таблиц со списком значений mysql, php?

Добрый день всем, помогите решить вопрос.

Есть несколько таблиц:
item, values_color, values_text, values_razmery, values_varchar

В item ключевые поля (id, name):
1 | цвет
2 | примечание
3 | размеры
4 | ткань
5 | цвет основания
6 | размеры основания

В остальных таблицах values_* ключевые поля (item_id, value), т.е. в них содержатся значения полей из таблицы item.
К примеру таблица values_color:
item_id | value
1 | зеленый
1 | красный
1 | чёрный
5 | коричневый
5 | зелёный

или таблица values_razmery:
item_id | value
3 | 50 мм
3 | 10 мм
6 | 50 мм

И так далее. Нужно сделать так, чтобы на сайте выводилось примерно так:
Цвет:
  • Зелёный
  • Красный
  • Чёрный

Цвет основания:
  • Коричневый
  • Зелёный

Размеры:
  • 50 мм
  • 10 мм

Размеры основания:
  • 10 мм
.

То есть у одного значения из таблицы item, например цвет, выводились все значения из таблицы values_color, которые принадлежат определенному id из item (item.id=values_color.item_id) и из других таблиц тоже соответствующим списком.
Никак не могу понять, как такое реализовать.
SELECT * FROM item as i LEFT JOIN values_color as vc ON (i.id=vc._item_id) LEFT JOIN values_text as vt ON (i.id=vt._item_id)... пробовал, но тогда дублирует значения из таблицы item и получается так:
"Цвет: зелёный
Цвет: красный
Цвет: коричневый
Размер:
Размер основания:"
Если делать GROUP by то выводится только одно значение. А как на PHP ещё это вывести, тем более не могу придумать. Заранее спасибо!
  • Вопрос задан
  • 222 просмотра
Пригласить эксперта
Ответы на вопрос 1
rozhnev
@rozhnev Куратор тега PHP
Fullstack programmer, DBA, медленно, дорого
$query = "
	SELECT 
		items.*, 
		GROUP_CONCAT(DISTINCT values_color.value) colors,
		GROUP_CONCAT(DISTINCT values_base_color.value) base_colors
	FROM items
	LEFT JOIN values_color ON values_color.item_id = items.id
	LEFT JOIN values_base_color ON values_base_color.item_id = items.id
	GROUP BY items.id, items.name
;";

// get DB version using PDO
$stmt = $pdo->prepare($query);
$stmt->execute();
$items = $stmt->fetchAll(PDO::FETCH_ASSOC);


PHP PDO online code test
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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