#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. Да, это неэффективное решение.