Сложный запрос один ко многим в MySql - PullRequest
1 голос
/ 07 декабря 2010

Я искал, но не могу сжать вопрос достаточно, чтобы найти соответствующий ответ. Мой опыт подсказывает, что это может быть проблемой дизайна ...

current_status
id
user_id
status_id
created

users
user_id
other...

current_status используется в основном для целей аудита. Каждый раз, когда изменяется статус пользователя, в current_status вставляется новая запись. Вот некоторые примеры состояния: «работает», «уволен», «применен», «уволен» и т. Д.

Запрос - я хочу вернуть только самый последний статус каждого пользователя плюс сведения о пользователе ...

SELECT users.*, current_status.status_id AS status 
FROM users 
JOIN current_status ON users.user_id = current_status.user_id 
WHERE users.user_id = '1'

Как мне сказать запросу вернуть самый последний status_id для пользователя?

ORDER BY current_status.created DESC LIMIT 0,1

Тем не менее, это действительно точный способ сделать это, потому что, если я хочу вернуть несколько пользователей?

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

РЕДАКТИРОВАТЬ Думаю, у меня теперь есть представление о ваших таблицах / столбцах ...

SELECT    users.*,
         (SELECT   current_status.status_id
          FROM     current_status
          WHERE    current_status.user_id = users.user_id
          ORDER BY current_status.created DESC
          LIMIT    1) AS status
FROM      users
WHERE     users.user_id = '1'

EDITv2 Кроме того, если вы хотите присоединитьсятаблицу, чтобы сохранить себе запрос позже, вы можете использовать:

SELECT    users.*, current_status.*
FROM      users
  LEFT JOIN current_status
  ON        current_status.status_id = (
    SELECT   current_status.status_id
    FROM     current_status
    WHERE    current_status.user_id = users.user_id
    ORDER BY current_status.created DESC
    LIMIT    1
  )
WHERE     users.user_id = '1'
0 голосов
/ 07 декабря 2010

К сожалению, MySQL не поддерживает функцию over(order by ...).Это займет подзапрос, чтобы выбрать все последние статусы:

select 
  user.user_id, status.status_id, status.created
from user 
  join status on user.user_id = status.user_id
  join (
  select user_id, max(created)
  from status
  group by user_id
) last_status
on 
  status.user_id = last_statuses.user_id
    and status.created = last_statuses.created
0 голосов
/ 07 декабря 2010

Может, как-то так?

SELECT users.*, current_status.status_id AS status
FROM
users,
current_status
WHERE users.user_id = '1' AND
users.user_id = current_status.user_id AND
current_status.status_id IN (SELECT max(status_id) FROM current_status GROUP_BY user_id))
...