@t38c3j

Как сделать выборку из 3 таблиц?

Есть три таблицы со следующим содержанием:
mysql> select * from `users`;
+----+-------+----------+----------+
| id | email | password | nickname |
+----+-------+----------+----------+
|  1 | email | password | nickname |
+----+-------+----------+----------+
|  2 | email | password | nickname |
+----+-------+----------+----------+

mysql> select * from `users_data`;
+---------+-----------+----------+
| user_id | firstname | lastname |
+---------+-----------+----------+
|       1 | firstname | lastname |
+---------+-----------+----------+
|       2 | firstname | lastname |
+---------+-----------+----------+

mysql> select * from `users_sessions`;
+---------+----------------------------------+
| user_id | token                            |
+---------+----------------------------------+
|       1 | 01234567890123456789012345678901 |
+---------+----------------------------------+
|       2 | 01234567890123456789012345678902 |
+---------+----------------------------------+


Как сделать выборку с этих трёх таблиц чтоб результат был такой
array
  'id' => 1
  'email' => 'email'
  'password' => 'password'
  'nickname' => 'nickname'
  'data' => 
    array
      'user_id' => 1
      'firstname' => 'firstname'
      'lastname' => 'lastname'
  'session' => 
    array
      'user_id' => 1
      'token' => '01234567890123456789012345678901'


То есть в коде можно было обращаться к данным так
<?php

$result['id'];
$result['nickname'];

$result['data']['firstname'];
$result['data']['lastname'];

$result['session']['user_id'];
$result['session']['token'];


Пример логики запроса или тип того
select * from
	(select * from `users_sessions` where `user_id` = 1 and `token` = '01234567890123456789012345678901') as `session`,
	(select * from `users_data` where `user_id` = `session`.`id`) as `data`,
	select * from `users` where `id` = `session`.`id`
  • Вопрос задан
  • 287 просмотров
Решения вопроса 1
AMar4enko
@AMar4enko
Если users, users_data и users_sessions связаны один-к-одному, то left join (хотя почему бы в таком случае не хранить все в одном месте).

Если один-ко-многим, то по запросу на каждую таблицу и обрабатывайте в коде, по-другому никак.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@dmitryKovalskiy
программист средней руки
SELECT something FROM users as u
LEFT JOIN users_data as ud ON u.id = ud.user_id
LEFT JOIN users_sessions as us ON u.id = us.user_id

Если нужны пользователи только с имеющимися данными user_data,user_sessions - меняем LEFT на INNER
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы