2010-10-21 5 views
0

je simple (espérons-le) question de SQL pour vous, toute aide serait beaucoup, beaucoup apprécié :).MySQL se joindre à la question, joindre le plus récent enregistrement dans une relation un à plusieurs

J'ai deux tables que je voudrais rejoindre.

Un Utilisateur, permet de dire qu'il appelle les utilisateurs

One est une sorte d'histoire de cet utilisateur, permet de dire que son appelé users_history.

La relation entre ces deux est un utilisateurs à beaucoup users_history relation.

Ce que je voudrais faire est une requête qui joint les tables et rejoint le nouveau record en users_history sur chaque utilisateur.

disent les tables Lets sont comme ça, je simplifie un souci de concision.

utilisateurs

  • id
  • Nom

users_history

  • id
  • user_id
  • Date

La date est formatée AAAAMMJJ.

Le résultat final est que je voudrais être en mesure de tirer tous les utilisateurs qui n'ont pas un record users_history aujourd'hui, par exemple aujourd'hui est 20101021.

Toute aide serait très chaleureusement reçu ! :)

Répondre

3

Essayez

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() 

Si vous ne voulez pas les utilisateurs qui ne marche pas avoir des dossiers eny de users_history ResultSet, changer le "LEFT JOIN" à un "JOIN"

+0

S'il n'existe aucun enregistrement Users_history pour un utilisateur, MAX (users_history.date) sera NULL et la clause HAVING échouera. Les utilisateurs sans enregistrement Users_history satisfont aux exigences et doivent être sélectionnés. –

+0

+1 COALESCEing la date MAX avec une date avant aujourd'hui dans la clause HAVING devrait prendre soin de la question que Paul mentionne dans sa première phrase. –

1

Si tout ce que vous voulez vraiment est trouver les utilisateurs sans une entrée user_history pour aujourd'hui, vous pouvez utiliser un sous-requête comme ceci:

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

à mon humble avis, ce qui est plus lisible que une jointure et un certain filtrage dans votre hôte la langue.

modifier: A en juger par votre description de format de date, vous utilisez probablement une colonne varchar pour stocker la date. Dans ce cas, remplacez DATE(NOW()) par la représentation de chaîne appropriée pour "aujourd'hui" - bien que je recommanderais de changer le type de colonne en date/time type.

1

tirer sur tous les utilisateurs qui ne disposent pas d'enregistrement users_history pour aujourd'hui, par exemple aujourd'hui est 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;