Вопрос присоединения к mysql, объединяющий новейшую запись в отношениях один ко многим - PullRequest
0 голосов
/ 21 октября 2010

У меня есть простой (надеюсь) вопрос SQL для вас, любая помощь будет очень, очень ценится:).

У меня есть две таблицы, к которым я бы хотел присоединиться.

One Is Users, допустим, он называется пользователями

Один из них - это история этого пользователя, скажем, так называемая users_history.

Отношение между этими двумя типами пользователей ко многим users_history отношения.

Что я хотел бы сделать, так это запрос, который объединяет таблицы и присоединяет новейшую запись в users_history к каждому пользователю.

Допустим, таблицы такие, я упрощаю для краткости.

Пользователи

  • ID
  • имя

users_history

  • ID
  • user_id
  • дата

Дата форматируется ГГГГММДД.

Конечным результатом является то, что я хотел бы иметь возможность вытащить всех пользователей, у которых на сегодня нет записи users_history, например сегодня 20101021.

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

Ответы [ 3 ]

3 голосов
/ 21 октября 2010

Попробуйте

SELECT MAX(users_history.date), users.name FROM users 
LEFT JOIN users_history ON users.id = users_history.user_id
GROUP BY users_history.user_id
HAVING MAX(users_history.date) < CURDATE()

Если вы не хотите, чтобы пользователи, у которых нет записей eny users_history в наборе результатов, измените «LEFT JOIN» на «JOIN»

1 голос
/ 21 октября 2010

извлекает всех пользователей, у которых на сегодняшний день нет записи users_history, например, сегодня 20101021.

select
 u.*
from
 users u
left outer join users_history uh on 
  u.id = uh.user_id and uh.history_date = curdate()
where
 uh.user_id is null;
1 голос
/ 21 октября 2010

Если все, что вам действительно нужно, это найти пользователей без записи user_history на сегодня, вы можете использовать подзапрос, например, так:

SELECT * FROM users WHERE NOT EXISTS (SELECT id FROM users_history WHERE user_id = users.id AND `date` = DATE(NOW()));

ИМХО, это более читабельно, чем объединение и некоторая фильтрация на вашем языке хоста.

edit: Судя по описанию формата даты, вы, вероятно, используете столбец varchar для хранения даты. В этом случае замените DATE(NOW()) соответствующим строковым представлением для «сегодня» - хотя я бы рекомендовал изменить тип столбца на тип даты / времени .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...