2012-07-23 5 views
0

Je tables:Rejoindre dossier pour obtenir le plus récent

utilisateurs

id | first_name | last_name 
1 Johnny  Steve 
2 Kim   Borden 

vente

id | user_id | service_id | date 
1 1   2   2012-02-12 
2 1   6   2012-04-21 

Je voudrais récupérer la liste des utilisateurs avec leurs informations de ventes récentes ci-joint. NULL est si rien n'a été trouvé.

Ce que j'ai jusqu'à présent:

SELECT 
    users.*, 
    sales.*, 
FROM 
    users 
LEFT JOIN 
    sales ON users.id=sales.user_id 

Mais cela crée deux dossiers pour Johnny en raison des deux ventes. Des idées?

+0

Cherchez-vous seulement un utilisateur à la fois ou essayez-vous d'obtenir le record de ventes le plus récent pour tous les utilisateurs? –

+0

Je cherche à obtenir une liste de tous les utilisateurs dans le tableau avec des colonnes supplémentaires ayant les informations de vente de la vente la plus récente. – user622469

Répondre

0

SELECT u.id comme id, u.first_name comme prenom, u.last_name comme last_name, MAX (s.date) comme date FROM utilisateurs comme u LEFT JOIN ventes comme s sur u.id = s.user_id GROUP BY id

Consultez ces liens pour obtenir des structures de requête de type N par groupe les plus complexes.

http://www.xaprb.com/blog/2006/12/07/how-to-select-the-firstleastmax-row-per-group-in-sql/

+0

Comment obtenir le dernier service_id? – user622469

+0

Est-ce que quelque chose est absolument nécessaire? Cela rendra la requête beaucoup plus complexe si vous avez besoin d'obtenir toutes les données utilisateur avec une seule requête. –

+0

Oui, j'ai besoin de toutes les colonnes des ventes, qui sont plus que service_id. – user622469

0
SELECT 
     u.*, 
     SUBSTRING_INDEX(GROUP_CONCAT(s.id ORDER BY s.date DESC,s.id DESC),',',1) as sale_id, 
     SUBSTRING_INDEX(GROUP_CONCAT(s.service_id ORDER BY s.date DESC,s.id DESC),',',1) as service_id, 
     SUBSTRING_INDEX(GROUP_CONCAT(s.date ORDER BY s.date DESC,s.id DESC),',',1) as sale_date 
FROM users u 
LEFT JOIN sales s ON s.user_id = u.id 
GROUP BY u.id; 

c'est le plus proche, vous pouvez obtenir à « dernière vente » sans avoir le temps

+0

simplement parce que l'ID auto-incrémenté est plus élevé, ne signifie pas que la date est la plus récente. Mais vous auriez besoin de vous joindre automatiquement à la table des ventes dans une sous-requête pour obtenir la date la plus récente pour chaque utilisateur. –

+0

Les valeurs de colonne @MikeBrant n'incluent pas l'heure, cela ne fonctionnera donc pas. – Andy

0
SELECT u.*, s.*, 
    FROM users u 
    LEFT JOIN 
(select max(id) as sales_id, user_id from sales group by user_id) sa 
on sa.user_id = u.id 
    LEFT JOIN sales s ON sa.user_id=s.user_id and s.id=sa.sales_id 

EDIT: si vous faites la date TIMESTAMP vous pouvez l'utiliser au lieu de id dans MAX(). Si vous le conservez comme date, vous pouvez toujours l'utiliser, mais vous obtiendrez des enregistrements supplémentaires au cas où il y aurait plus d'une vente pour l'utilisateur en un jour.

0

Sans l'utilisation de fonctions analytiques, c'est un moyen assez simple de faire ce que vous essayez de faire:

select users.*, sales.* 
from users, 
(select a.* 
    from sales a, 
     (select user_id, MAX(date) as mostRecentDate 
     from sales 
     group by user_id) b 
    where a.user_id = b.user_id 
     and a.date = b.mostRecentDate) sales 
where users.id = sales.user_id; 

Je n'ai pas un serveur MySQL disponible pour moi au moment de tester cela, si elle donne des erreurs, juste après retour.

+0

En regardant vos autres commentaires, cette requête est susceptible de résoudre votre problème. Je m'inquiète seulement de l'alias sur la sous-requête de vente, mais cela devrait être facile à résoudre. Cela devrait vous donner toutes les colonnes dans les ventes et les utilisateurs. – Hermit

Questions connexes