Возможно ли объединить полную запись (всю строку) в один столбец в MySQL? и как?

#php #mysql #sql #sql-server #json

#php #mysql #sql #sql-сервер #json

Вопрос:

В моей базе данных есть 2 таблицы, одна для sublets и одна для users .
Связь заключается в том, что у каждого user может быть несколько подзаголовков.
Внешний ключ в таблице — это идентификатор пользователя. sublets

 TABLE users {
   id,
   name
},

TABLE sublets {
   sublet_id,
   city_id,
   user_id,
   rooms,
   floor,
   price
}
  

Теперь предположим, что user с идентификатором 46 имеет 3 подзаголовка.

Если я JOIN таблицу подзаголовков:

 SELECT * FROM users JOIN sublets ON users.id = sublets.user_id WHERE users.id = 46
  

Я получаю 3 строки, каждая для каждого подзаголовка.

 id | name  | sublet_id | city_id | user_id | rooms | floor | price
=================================================================
46 | "Joe" |  1        | 20      | 46      | 2     | 2     | 30
46 | "Joe" |  2        | 13      | 46      | 3     | 5     | 20
46 | "Joe" |  3        | 2       | 46      | 1     | 1     | 10
  

Мой желаемый результат — иметь 1 строку со всеми подзаголовками в одном столбце с именем user_sublets .

Например:

 id | name  | sublets
====================
46 | "Joe" | ["sublet_id":1,"city_id":20, "user_id":46,...],["sublet_id":2,...]...
  

Итак, теперь у меня есть все подзаголовки внутри этого одного столбца, вы можете видеть, что я могу захотеть использовать его как JSON

 user: {
   "id": 46,
   "name": "Joe",
   "sublets": [
     {
        "sublet_id":1,
        "city_id":20,
        ...
     },
     {
        "sublet_id":2,
        "city_id":13,
        ...
     },
     {
        "sublet_id":3,
        "city_id":2,
        ...
     }
   ]
}
  

Итак, в конечном итоге основная причина, по которой я хочу добиться этого результата, — использовать его как JSON в моем приложении с 1 запросом вместо необходимости дважды запрашивать базу данных и добавлять подзаголовки с помощью языка программирования (т.Е. PHP).

Насколько мне известно GROUP_CONCAT , я могу объединить только один столбец, поэтому я не могу объединить все столбцы, и объединение его с concat просто слишком запутанно для меня, потому что, если я добавляю новый столбец в таблицу подзаголовков, мне придется редактировать свой запрос во многих разных местах.

Какое лучшее решение? будет ли медленнее выполнять 2 запроса и объединять подзаголовки для пользователя с помощью языка программирования?

Заранее спасибо!

Надеюсь, я предоставил достаточно информации и четко описал свои потребности.

Ответ №1:

Я не знаю, эффективное это решение или нет, но вы можете использовать комбинацию GROUP_CONCAT и CONCAT .

Вот так,

 SELECT 
user_id,name,
GROUP_CONCAT(CONCAT('[',
CONCAT("{'sublet_id':",sublet_id,",city_id:'",city_id,"'}"),']'))
FROM users 
JOIN sublets 
ON users.id = sublets.user_id 
WHERE users.id = 46
  

Вы можете добавить больше столбцов в секунду CONCAT() .

Комментарии:

1. Как раз собирался написать почти то же самое 1

2. Это то, что я имел в виду, когда сказал, что если я добавлю новый столбец в таблицу подзаголовков, мне придется редактировать этот запрос во многих местах, поэтому это не будет лучшим способом, чем написать одну функцию на языке программирования, а не делать это в MySQL. Я знал это решение, но считаю его неэффективным, в любом случае спасибо, что предложили его!

3. Да, это неэффективное решение.