recky
@recky

Запрос с объединением в MySQL

Имеется БД с двумя таблицам users (user_id, email, password, user_type) и user_profiles (user_id, profile_key, profile_value). Хранятся в них, соответсвенно, основные пользовательские данные и вторичные (пол, телефон, адрес и т. д.) Нужно сделать их объединение средствами исключительно SQL, так чтобы на выходе иметь один массив вида:
array {
[«user_id»]=> «1»
[«username»]=> «recky»
[«password»]=> «qwerty»
[«user_type»]=> «admin»
[«sex»] => «iAdmireIt»
[«hobbie»] => «playing tambourine»
}
Если делать «SELECT `u`.*, `up`.* FROM `users` AS `u`
INNER JOIN `users_profile` AS `up`», то на выходе я получаю 2 массива с полями profile_key и profile_value с разными значениями в каждом.

Возможно ли средствами SQL реализовать это? И как?
  • Вопрос задан
  • 2743 просмотра
Пригласить эксперта
Ответы на вопрос 5
@Loki3000
Вы не указали признак объединения:
SELECT * FROM table1 t1 JOIN table2 t2 ON t1.user_id=t2.user_id
Ответ написан
apangin
@apangin
В MySQL нет понятия «массив», там есть записи (строки) и поля (столбцы). Вы хотите, чтоб MySQL вернул все данные одного пользователя в одной записи? Это можно, с помощью, скажем, GROUP_CONCAT, но неправильно — зачем тогда вообще вторая таблица нужна, храните все в одной.

Правильным способом будет указанный выше запрос с INNER JOIN. Для того, чтобы собрать полученные данные в один массив, понадобится обойти полученный RecordSet в цикле по записям.
Ответ написан
taliban
@taliban
php программист
Если данных (количество записей в профиле для одного юзера) мало, то это вот Вас спасет, если много, то никак не сделаете.
Ответ написан
Комментировать
CKOPOBAPKuH
@CKOPOBAPKuH
select u.user_id,u.username,u.password,u.user_type
,up1.profile_value as sex
,up2.profile_value as hobbie
,up3.profile_value as ещёчегото
FROM users as u
LEFT JOIN user_profiles as up1 ON up1.user_id=u.user_id AND up1.profile_key=«sex»
LEFT JOIN user_profiles as up2 ON up2.user_id=u.user_id AND up2.profile_key=«sex»
LEFT JOIN user_profiles as up3 ON up3.user_id=u.user_id AND up3.profile_key=«sex»
Ответ написан
recky
@recky Автор вопроса
ладно, спасибо всем, буду всё-таки отдельные запросы делать. Профиль тогда вообще в отдельный класс запакую.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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