begin process at 2012 05 30 22:36:18
  Trouver un code source :
 
dans
 
Accueil > Forum > 

PHP

 > 

Base de données

 > 

MySQL

 > 

Obtenir la dernière ligne enregistrée par membre


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Obtenir la dernière ligne enregistrée par membre

samedi 13 novembre 2010 à 18:11:17 | Obtenir la dernière ligne enregistrée par membre

sagat06

Bonjour à tous,
je fais face à un souci au niveau d'une de mes requêtes

Voilà un exemple type exposant mon problème:

Je dispose de 3 tables sql sur lesquelles j'effectue une jointure:

Table amis (membre_id,ami_id) 1 membre-plusieurs amis,
Table membre_produits(membre_id,produit_id) 1 membre-plusieurs produits,
Table produit(produit_id,categorie,dispo)

Mon objectif est d'obtenir le dernier produit enregistré (son id et sa catégorie) par chacun de mes amis (donc une seule ligne / ami ) et qui est dispo (=1) (en réalité je fait un LIMIT 5 pour n'obtenir qu'un échantillon d'ami)

Dans mon raisonnement (sans utiliser le LIMIT), j'ai d'abord cherché à obtenir tout les produits enregistrés de mes amis et qui sont dispos
Voilà ma requête:

=> SELECT A.ami_id,B.produit_id,C.categorie FROM amis A JOIN membre_produits B ON (A.ami_id=B.membre_id AND A.membre_id='mon_id') JOIN produit C ON (B.produit_id=C.produit_id) WHERE C.dispo='1'

1) Trouvez-vous cette requête correcte ? Pour ma part, elle me renvoie comme résultat ce que j'en attend.

A partir de là, j'ai cherché à obtenir seulement un produit unique par ami (toujours sans me soucier du LIMIT)
Voilà la requête que j'utilise à cet effet:

=> SELECT max(B.produit_id),B.membre_id,C.categorie,C.produit_id FROM membre_produits B JOIN amis A ON (A.ami_id=B.membre_id AND A.membre_id='mon_id') JOIN produit C ON (B.produit_id=C.produit_id) WHERE C.dispo='1' GROUP BY B.membre_id

2) Là aussi que pensez-vous de cette requête ?

Elle me renvoie bien 1 seule ligne par ami et l'id max des produits d'un ami, mais les autres infos ne correspondent pas à celle de l'id_max mais
au premier produit enregistré dans la table alors que je cherche à avoir le dernier !

Sachant qu'un membre effectue cette requête de temps en temps, il obtient quoiqu'il arrive les mêmes résultats peu importe si de nouveaux produits ont été ajoutés par un de ses amis.

Avez-vous des idées, des directions, des suggestions à me proposer ?

NB: j'ai mis de côté DISTINCT car il me semble que je ne peux l'utiliser sur une seule des colonnes d'une table

En l'attente de vos réponses,
merci d'avance.


Signé Sagat
samedi 13 novembre 2010 à 20:21:26 | Re : Obtenir la dernière ligne enregistrée par membre

gorgonite

si tu avais un moyen de "dater" l'association membre/produit, il te serait possible de faire un WHERE NOT EXISTS pour ne garder que l'association la plus récente de chaque utilisateur


samedi 13 novembre 2010 à 20:50:15 | Re : Obtenir la dernière ligne enregistrée par membre

sagat06


Merci d'avoir pris le temps de répondre.

J'évitais justement de devoir dater cette association car je n'en ai aucune utilité, en dehors de celle que tu me proposes.

De plus, je ne sais pas du tout me servir de WHERE NOT EXISTS, pourrais-tu me donner un exemple simple à partir de mon cas avec la table membre_produit (membre_id,produit_id,date).

Sinon, j'ai finalement réussi à obtenir ce que je voulais mais la requête semble assez complexe. Je vous laisse en juger:

SELECT A.membre_id,A.produit_id,D.categorie FROM membre_produits A JOIN (SELECT Max(produit_id) As prod,membre_id FROM membre_produits GROUP BY membre_id) As B ON (B.prod=A.produit_id AND A.membre_id=B.membre_id) JOIN amis C ON (C.ami_id=A.membre_id AND C.membre_id='mon_id') JOIN produit D ON (D.produit_id=A.produit_id)

Cette requête me donne bien ce que je recherche: uniquement le dernier produit enregistré et sa catégorie pour chacun de mes amis.

Mais n'est-elle pas trop complexe, en sachant qu'elle sera executée avec un LIMIT 5 quasi généralement ?


Toujours en l'attente de vos avis, idées, critiques...
merci d'avance.

Signé Sagat
dimanche 14 novembre 2010 à 12:24:58 | Re : Obtenir la dernière ligne enregistrée par membre

gorgonite

pas d'accord avec ton raisonnement qui suppose que les amis vont faire des associations membre/produits au fur et à mesure de l'ajout des produits dans l'inventaire... d'où le MAX(produit_id)
Il s'agit d'une énorme supposition sur les scénarios possibles... et ça doit marcher surtout sur ton cas de test (cf Myers 79 si tu veux être convaincu que des bons tests ne suffisent pas -- déformation professionnelle venant de l'analyse statique)


je reviens avec un exemple de requête plus tard... (mauvaise manip, j'ai tout perdu mon beau message, donc je refais au propre et je poste ^^)
dimanche 14 novembre 2010 à 12:32:31 | Re : Obtenir la dernière ligne enregistrée par membre

sagat06


En fait, l'exemple que je prend est un cas particulier ou le produit_id définit justement l'ordre chronologique: supposons des ventes flash journalières uniques sur 1 seul produit.

A 1 journée ne peut donc correspondre qu'un seul produit_id.

J'aurais dû préciser cela, je m'en excuse.

Cependant, vu qu'en règle générale, tel n'est pas le cas, je suis toujours intéressé par ton exemple de requête.


Merci encore.

Signé Sagat
dimanche 14 novembre 2010 à 12:48:05 | Re : Obtenir la dernière ligne enregistrée par membre

gorgonite

je trouve pas comment éditer le post...

un premier jet, mais j'ai pas de SGBD sous la main pour tester (vive les WE en famille ^^)

SELECT A.ami_id,B.produit_id,C.categorie
FROM amis A
JOIN membre_produits B ON (B.membre_id=A.ami_id)
JOIN produits C ON (B.produit_id=C.produit_id)
WHERE A.membre_id='mon_id' AND C.dispo='1' AND
NOT EXISTS (
SELECT * FROM membre_produits D WHERE D.date>B.date
)
dimanche 14 novembre 2010 à 12:52:02 | Re : Obtenir la dernière ligne enregistrée par membre

gorgonite

au passage, il faudrait peut-être optimiser ton schéma de base... le C.dispo='1' me semble suspect, de même cette grosse requête peut devenir une procédure stockée et préciser les INNER/OUTER JOIN :)
dimanche 14 novembre 2010 à 12:59:41 | Re : Obtenir la dernière ligne enregistrée par membre

sagat06


Ok, je teste la requête dans l'aprèm et reviens avec mes observations.

Pour les INNER/OUTER JOIN, je n'ai rien préciser considérant qu'il s'agit par défaut de INNER JOIN.

Le C.dispo='1' n'est qu'une info quand à la disponibilité du produit => vente flash journalière d'un produit non limité en quantité. C'est un peu tiré par les cheveux, j'en conviens mais de toute manière cette condition devrait la plupart du temps être vérifié.

Pour les procédures stockées, faut que je me renseigne. Je sais que ça existe mais n'en ai jamais utilisé.

Merci encore une fois.

Signé Sagat
dimanche 14 novembre 2010 à 13:24:01 | Re : Obtenir la dernière ligne enregistrée par membre

gorgonite

petit oubli dans le WHERE du NOT EXISTS, il faut aussi s'assurer qu'on parle bien du même membre
dimanche 14 novembre 2010 à 16:39:48 | Re : Obtenir la dernière ligne enregistrée par membre

sagat06

Re,

en testant ta requête et la modifiant légèrement, j'obtiens un résultat intéressant. Pour cela, j'ai rajouté des dates aléatoires sur les associations membre/produit

Voilà la requête finale:

SELECT A.ami_id,B.produit_id,C.categorie FROM amis A JOIN membre_produits B ON (B.membre_id=A.ami_id) JOIN produit C ON (B.produit_id=C.produit_id) WHERE NOT EXISTS (SELECT * FROM membre_produits D WHERE D.quand>B.quand AND D.produit_id=B.produit_id) AND A.membre_id='".$a."' AND C.dispo='1' ";

J'ai donc rajouté dans la requête incluse dans le NOT EXISTS l'égalité D.produit_id=B.produit, sans cela je n'obtenais aucun résultat (num_rows=0)

Résultat: la requête me retourne bien le dernier produit enregistré par chacun de mes amis, bien que là aussi elle me paraisse bien complexe. Pour info les colonnes ami_id,membre_id,produit_id sont indexées, et cette requête ne sera exécutée qu'1 seule fois par membre sur une page donnée (résultat stockée dans une session et réutilisée durant une période donnée -30/40 mn- avant d'être ré-exécuté, etc...)

Ne me reste plus qu'à tester les performances des différentes requêtes me donnant le même résultat, et de m'intéresser aux procédures stockées.

Merci encore.

Signé Sagat

1 2

Cette discussion est classée dans : id, produit, amis, membre, ami


Répondre à ce message

Sujets en rapport avec ce message

afficher amis [ par joujma5 ] bonjour,j'ai un peu de temps que je cherche comment procéder au principe d'ajout d'amis de facebook,en faite j'ai utilisé deux tables la première 'ins Erreur SQL 1442, Requete UPDATE ne marche pas [ par noxa03 ] Bonjour, J'ai voulu créer un trigger qui calcule le nouveau prix ttc d'un produit quand le produit reçois une promotion (id_promo). Malheureusement SELECTION DU N° DE L'ID EN CLIQUANT SUR UN LIEN [ par escabot ] Bonsoir, Je cherche desespérement la bonne syntaxe qui permettrait de sélectionner les coordonnées (stockées dans la bdd phpmyadmin) correspondant à problème de jointure entre plusieurs tables [ par Krasha ] Bonjour à tous, Je bloque depuis deux jours sur une requête pour extraire des données de plusieurs tables (pour le site de restaurant). Je dois en ef session et parametres membres [ par apz ] salut,dans une zone membre, on doit souvent rediriger l'utilisateur vers cette derniere apres une identification reussite, comme suit : header("locati probleme requete d'insertion [ par titigrou ] kikou!!j'ai un problème avec une requete d'insertion que voici: $requete = "INSERT INTO reserver VALUES ('".$reqpseudo['pseudo']."','".$_POST['voiture Pb de zone membre.php [ par darksmiling ] je suis débutant en terme de php et j'ai un petit probleme avec ma zone membre. Disons plus tôt que je ne sais pas comment faire quelque chose. Je tie update formulaire... [ par djinko ] Bonjour, J'ai deux tables : Code: <FONT f manier les nombres en fonction d'un membre connecté [ par Trigun222 ] Salut,J'utilise le scipt de az-php pour mon espace membre c'est à dire celà :session_start();$ya= "select * from jeu_membres where login='$login' and et oui encore recuperer variable aprés url? [ par juliacom ] je m explique j'ai ecris ce bout de code qui ne fonctionne pas   echo "&nbsp".$row["#null"]."Gestion du Stock\n";le but


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

Photothèque

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,640 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales