mysql LEFT JOIN основная таблица и две дополнительные таблицы с максимальным значением от каждого - PullRequest
0 голосов
/ 01 декабря 2018

Итак, у меня есть три таблицы:

Users
+-------+-----+----+
| id    | val1|val2|
+-------+-----+----+
| 1     |  1  |3   |
| 2     |  2  |5   |
| 3     |  4  |7   |
+-------+-----+----+

UsersData
+----+--------------+------------+-----|
| id | users_id     | created_at | gold|
+----+--------------+------------+-----|
|  9 |  1           |121454561212| 14  |
|  10|  1           |131454561212|  2  |
|  11|  2           |111454561212| 99  |
+----+--------------+------------+-----+

Extra
+----+------------+-----|
| id | users_id   | val4|
+----+------------+-----|
|  1 |  1         |  5  |
|  2 |  1         |  6  |
|  3 |  1         |  7  |
+----+------------+-----+

Итак, чего я хочу добиться (в одном запросе), так это получить однострочный результат для пользователя с id = 1, который содержит:

  • все из таблицы пользователей
  • значение золота самой последней записи для этого пользователя (users_id = 1, creation_at = MAX)
  • самый большой val4 из таблицы Extra, где users_id= 1

Таким образом, строка результата будет выглядеть следующим образом:

+-------+-----+----+-----+----+
| id    | val1|val2|gold |val4|
+-------+-----+----+-----+----|
| 1     |  1  |3   | 2   |  7 |
------------------------------+

Я могу получить Первая часть сделана с помощью

SELECT Users.id, Users.val1, Users.val2, UsersData.gold
FROM UsersData
LEFT JOIN Users ON UsersData.users_id = Users.id
WHERE Users.id = 1 
ORDER BY UsersData.created_at DESC
LIMIT 1

, а вторая частьс

SELECT MAX(Distances.distance) AS maxdistance FROM Distances WHERE Distances.users_id = 1

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

Спасибо!

Ответы [ 2 ]

0 голосов
/ 01 декабря 2018

Я бы использовал такие подзапросы, как это:

select u.*,
       (select ud.gold
        from userdata ud
        where ud.users_id = u.id
        order by ud.created_at desc
        limit 1
       ) as most_recent_gold,
       (select max(e.val4)
        from extra e
        where e.users_id = u.id
       ) as max_val4
from users u
where u.id = 1 ;
0 голосов
/ 01 декабря 2018

Просто используйте подзапрос:

SELECT Users.id, Users.val1, Users.val2, UsersData.gold,
(SELECT MAX(Distances.distance) FROM Distances WHERE Distances.users_id = Users.id) AS maxdistance
FROM UsersData
RIGHT JOIN Users ON UsersData.users_id = Users.id
WHERE Users.id = 1 
ORDER BY UsersData.created_at DESC
LIMIT 1

Это подзапрос, связанный с Users.id:

SELECT MAX(Distances.distance) FROM Distances WHERE Distances.users_id = Users.id) AS maxdistance
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...