@ICreator
webdev

Как осуществить выборку из нескольких таблиц с одинаковым полем value MYSQL?

Доброго дня.
Столкнулся с необходимостью произвести запрос к БД. Суть такова, что из двух таблиц надо получить 4 значения поля.
В таблице 1 я отбираю id и pagetitle
В таблице 2 содержатся 3 параметра, у которых значение лежат в соответствующем поле value.
Получается, что при выборке у меня создаются дубли под каждое значение поля value. Сам запрос я вывел таким:
SELECT
    site_tmplvar_contentvalues.contentid,
    site_tmplvar_contentvalues.value,
    site_content.id,
    site_content.pagetitle
FROM
    site_content
INNER JOIN site_tmplvar_contentvalues 
ON site_content.id = site_tmplvar_contentvalues.contentid 
AND site_content.parent = 17 
AND site_tmplvar_contentvalues.tmplvarid IN (2, 13, 14)

Результат работы выборки вот такой:
5dcdd06f511da098757991.jpeg

Т.е. value строки с id 2,13,14 как бы дублируются. Можно ли их в результате выборки как-то переименовать, чтобы они выводились отдельными столбцами что ли для последующей сортировки в php?

В дальнейшем мне надо будет из полученного массива в php произвести сравнение значений полей с текущей датой и временем, найти ID человека по этим данным и вывести его на сайт.
Благодарю.
  • Вопрос задан
  • 235 просмотров
Пригласить эксперта
Ответы на вопрос 1
Immortal_pony
@Immortal_pony Куратор тега MySQL
Если у параметров есть только значения, то можно их сложить в одну строку. В дальнейшем это строку обратно в массив можно будет разобрать с помощью функции explode
SELECT
    site_tmplvar_contentvalues.contentid,
    GROUP_CONCAT(site_tmplvar_contentvalues.value) AS 'values', -- все значения value складываем в одну строку. Разделитель по умолчанию - запятая, его можно поменять используя ключевое слово SEPARATOR
    site_content.id,
    site_content.pagetitle
FROM
    site_content
INNER JOIN site_tmplvar_contentvalues 
ON site_content.id = site_tmplvar_contentvalues.contentid 
AND site_content.parent = 17 
AND site_tmplvar_contentvalues.tmplvarid IN (2, 13, 14)
GROUP BY site_tmplvar_contentvalues.contentid -- добавляем группировку

Если же у параметров есть еще и названия, то уже придется упаковывать данные в строку способом посложнее. Например, преобразовать в JSON. В таком случае на стороне PHP вам понадобится функция json_decode чтобы преобразовать эти данные обратно в массив или объект.
Так как названия поле с ключом не указано, я предопожу то это site_tmplvar_contentvalues.key. Тогда запрос будет выглядеть так
SELECT
    site_tmplvar_contentvalues.contentid,
    CONCAT('[', GROUP_CONCAT(JSON_OBJECT('key', site_tmplvar_contentvalues.key, 'value', site_tmplvar_contentvalues.value)), ']') AS 'values',
    site_content.id,
    site_content.pagetitle
FROM
    site_content
INNER JOIN site_tmplvar_contentvalues 
ON site_content.id = site_tmplvar_contentvalues.contentid 
AND site_content.parent = 17 
AND site_tmplvar_contentvalues.tmplvarid IN (2, 13, 14)
GROUP BY site_tmplvar_contentvalues.contentid -- добавляем группировку
Ответ написан
Ваш ответ на вопрос

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

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