2009-08-12 6 views
1

J'ai un problème pour trier les résultats des tables de jointure qui doivent être regroupées dans Mysql.Grouper et classer avec des tables de jointure

Ceci est la configuration de mes tables.

Propriétaires Tableau

  • owner_id | owner_name
  • 1 | Propriétaire du test 1
  • 2 | Propriétaire du test 2
  • 3 | Test propriétaire 3

Images télécharger Table

  • image_id | nom_image | ownerid | upload_date
  • 1 | image1.jpg | 2 | 04-08-2009
  • 2 | image2.jpg | 1 | 04-08-2009
  • 3 | image3.jpg | 3 | 04-08-2009
  • 4 | image4.jpg | 1 | 04-08-2009
  • 5 | image5.jpg | 3 | 04-08-2009

Le champ owner_id est auto-incrémenté, de même que les champs image_id. Ce que j'essaye de faire est obtenir le nom de propriétaire pour les trois dernières images téléchargées mais pas par le même propriétaire. Donc, dans cet exemple, je voudrais qu'il renvoie les résultats suivants.

test propriétaire 3 propriétaire Test 1 propriétaire Test 2

Dans cet exemple le dernier propriétaire de télécharger est propriétaire Test 3 puis le propriétaire Test 1 puis propriétaire test 2.

J'utilise la requête suivante mais il ne retourne pas les résultats corrects

$sql = "SELECT u.*, s.* FROM UPLOAD_TBL u, OWNER_TBL s WHERE u.ownerid = s.owner_id 
GROUP BY s.owner_id ORDER BY u.image_id DESC LIMIT 0, 3"; 

Toute aide mettant en place cette requête serait grandement appréciée.

+0

À quoi ressemble votre instruction SELECT maintenant? – RKitson

Répondre

1

Voyez si vous pouvez trier sur l'ID d'image agrégée:

select s.owner_id, s.owner_name, max(u.imag_id) as last_image_id 
from UPLOAD_TBL u 
inner join OWNER_TBL s on s.ownerid = u.owner_id 
group by s.owner_id, s.owner_name 
order by last_image_id desc 
limit 3 
+0

C'est parfait. Je vous remercie! Fonctionne très bien. –

+0

Résolu mon problème aussi. Merci –

1

Vous devez simplement regrouper par owner_id et trier par upload_date DESC avec LIMIT 3

+0

Merci pour la réponse. J'ai essayé le suivant mais il ne restitue pas le résultat correct. $ sql = "SELECT. *, S. * FROM UPLOAD_TBL ​​u, OWNER_TBL s O WH u.ownerid = s.owner_id GROUPE BY s.owner_id ORDER BY u.image_id DESC LIMIT 0, 3 "; –

+0

vous utilisez des alias et ils ont l'intention de croiser mes yeux mais je pense que votre O WH est égaré Comment A propos de SELECT * FROM OWNER_TBL GAUCHE JOINDRE UPLOAD_TBL ​​ON propriétaire_id = ownerid GROUPE BY propriétaire_id ORDER BY image_id DESC LIMITE 3 si vous changez le nom de ownerid à OWNER_ID dans la 2ème table, vous pouvez utiliser plus simples LEFT JOIN UPLOAD_TBL ​​USING (owner_id) (ou tout autre jointure) réponse SEQU3L semble plus élégant que vous devriez utiliser EXPLAIN être en mesure de savoir lequel est le plus rapide –

+0

Merci également pour votre aide.C'était aussi sur la bonne voie de ce dont j'avais besoin. :) –

1

Que diriez-vous quelque chose comme:

select 
    distinct(owner_id), owner_name 
from 
    owner 
inner join 
    images on images.ownerid = owner.ownerid 
order by 
    images.upload_date desc limit 3
+0

Je suis pas de SQL-man, mais ne devrait-il pas être "FROM owner, images" puisque vous "appelez des images plus tard? En outre, compte tenu des résultats souhaités, une jointure à gauche devrait suffire, non? – KdgDev

Questions connexes