Выборка из двух таблиц базы данных mysql

267
23 апреля 2022, 16:50

Eсть 2 таблицы в БД: users

+----+-------+-------------+
| id | name  |   lastname  |
+----+-------+-------------+
|  1 | Иван  |   Иванов    |
|  2 | Петр  |   Петров    |
+----+-------+-------------+

users_info

+----+-------+-------+---------+
| id | user  | field | data    |
+----+-------+-----------------+
|  1 | 2     | 1     | Петрович|
|  2 | 1     | 1     | Иванович|
|  3 | 1     | 3     | +791398 |
|  4 | 1     | 4     | Москва  |
|  5 | 2     | 4     | Питер   |
|  6 | 2     | 3     | 892641  |
+----+-------+-------+---------+

Как можно получить значения в таком виде:

1 Иванов Иван Иванович +791398 Москва
2 Петров Петро Петрович 892641 Питер

Можно ли это сделать в mysql? я делаю так:

SELECT u.id, u.username, u.firstname, u.lastname, l.data, l.fieldid
        FROM mdl_user as u
            LEFT JOIN mdl_user_info_data AS l on u.id = l.userid

Но получаю:

1 Иван Иванов +791398
1 Иван Иванов Москва
1 Иван Иванов Иванович
2 Петр Петров 892641
2 Петр Петров Питер
2 Петр Петров Петрович

Запрос делаю в mysql и обрабатываю php. Или в php уже как-то склеить их?

Answer 1

Вы можете воспользоваться следующим запросом:

SELECT 
    users.*,
    middle_name.data as middle_name,
    phone.data as phone,
    city.data as city
FROM users
LEFT JOIN users_info as middle_name ON middle_name.user = users.id and middle_name.field=1
LEFT JOIN users_info as phone ON phone.user = users.id and phone.field=3
LEFT JOIN users_info as city ON city.user = users.id and city.field=4
;

Проверить запрос на SQLize.online

В запросе испльзуется многократное соединение таблицы с различными условиями и алиасами

Другой подход pivot для таблицы users_info и соединение с таблицей usrs:

SELECT 
    users.*,
    GROUP_CONCAT(IF(field=1, data, null)) as middle_name,
    GROUP_CONCAT(IF(field=3, data, null)) as phone,
    GROUP_CONCAT(IF(field=4, data, null)) as city
FROM users_info
JOIN users ON users.id = users_info.user
GROUP BY user, users.id, users.name, users.lastname;

Пример здесь

READ ALSO
Помогите изменить sql запрос

Помогите изменить sql запрос

У меня на сайте(DRUPAL) есть модуль цитата дня, каждый день меняется цитата, мне надо что бы она менялась один раз в неделю, как реализовать, я что-то...

212
mysql REGEXP выборка по слову включая один символ

mysql REGEXP выборка по слову включая один символ

Не могу составить запрос к базе mqsqlК примеру в базе есть слова:

236
Реализация вывода новых заказов

Реализация вывода новых заказов

Подскажите плзЕсть задача на php никак не могу придумать как ее реализовать: Вобщем Есть таблица с пользователями, пользователи делятся на две...

132