2016-01-14 5 views
0

У меня есть два стола users и transactions. transactions таблица имеет отношение с пользователями два формата таблицы, как показано нижеКак получить самый последний баланс от многих пользователей балансов?

users 
id name email  created 
1 a  [email protected] 12-03-01 
2 b  [email protected] 11-03-01 


Transactions 
id user_id balance 
1 1  250 
2 1  550 
3 2  50 
4 2  1000 

Мне нужно вставить последний баланс пользователей из таблицы транзакций со всей информацией пользователей. Я новичок в sql.

Так что я попытался ниже код

select * from transactions 
where id in (select max(id) from transactions group by user_id) 
INNER JOIN users on transactions.user_id=users.id 

Это дает мне синтаксическую ошибку рядом с внутренней join.Have я сделал какую-либо ошибку в INNER JOIN? или я в неправильном направлении?

+2

'join's приходят ** ДО **' where' положение. 'select ... from ... join ... where ...' –

+0

@SatuSultana. , , Вы хотите вернуть одну строку или одну строку на пользователя? Ваш вопрос неоднозначен. –

ответ

1

Если вы хотите только баланс, то коррелированные подзапросы могут быть быстрее:

select u.*, 
     (select t.balance 
     from transactions t 
     where t.user_id = u.id 
     order by t.id desc 
     limit 1 
     ) as MostRecentBalance 
from users u; 

Для достижения максимальной производительности, вы хотите индекс на transactions(user_id, id desc, balance).

Причина, по которой это происходит быстрее, потому что она позволяет избежать агрегации по всей таблице transactions. Это еще более важно, если вы выбираете только подмножество пользователей.

РЕДАКТИРОВАТЬ:

Я первоначально прочитал этот вопрос как одну строку для каждого пользователя. Однако, если вы хотите только одну строки возвращенной - для последней вставки в transactions - то более простой способ:

select u.*, t.balance 
from users u join 
    transactions t 
    on u.id = t.user_id 
order by t.id desc 
limit 1; 
+0

Спасибо за ваш ans.Top. Один правильный. Мне нужны все данные пользователей не только. –

0

JOIN должен быть частью оператора FROM, поэтому он должен больше походить на код ниже.

select * 
from transactions ts 
INNER JOIN users 
ON (transactions.user_id=users.id) 
where ts.id in 
      (
      select max(transactions.id) 
      from transactions 
      group by user_id 
      ); 

отредактированный выяснить, какой идентификатор используется согласно Гордонс предложению

+0

Я получаю эту ошибку # 1052 - Столбец 'id' в IN/ALL/ANY подзапрос неоднозначен –

+0

@HardLeeWorking. , , Это хорошая идея, чтобы квалифицировать имена всех столбцов при написании запроса. Я бы посоветовал вам исправить ваш запрос, чтобы избежать ошибки, которую указал Сату. –

+0

@GordonLinoff добавлено в пояснениях, как вы предложили – HardLeeWorking

0

2 простых методов.

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

SELECT users.* 
FROM users 
INNER JOIN transactions 
ON users.id = transactions.user_id 
INNER JOIN 
(
    SELECT MAX(id) AS max_id 
    FROM transactions 
) sub0 
ON transactions.id = sub0.max_id 

Или вы могли бы попробовать заказ по идентификатору убыванию с лимитом 1: -

SELECT users.* 
FROM users 
INNER JOIN transactions 
ON users.id = transactions.user_id 
ORDER BY transactions.id DESC 
LIMIT 1 

EDIT

Чтобы получить последнюю транзакцию для всех пользователей, то вы можете использовать следующее: -

SELECT * 
FROM users 
INNER JOIN transactions 
ON users.id = transactions.user_id 
INNER JOIN 
(
    SELECT user_id, MAX(id) AS max_id 
    FROM transactions 
    GROUP BY user_id 
) sub0 
ON transactions.id = sub0.max_id 
ON transactions.user_id = sub0.user_id 
+0

Здесь я получаю только одну информацию, но мне нужно, чтобы все последние вставленные вами данные оставались в силе. –

+0

Я добавил решение для этого – Kickstart

Смежные вопросы