Précédent   Forum des professionnels en informatique > Bases de données > MySQL > Requêtes
Requêtes Forum d'entraide sur les requêtes MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/12/2011, 14h42   #1
Invité régulier
 
Homme Sylvain
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 5
Points : 5
Par défaut Requête impossible ?

Bonjour,

j'aurais aimé savoir si cette requête était possible :

J'ai 2 tables : client et achat sachant que dans la table achat il y a une clé étrangère qui relie un achat à un client.

Je voudrais sortir le 4ème achat pour tous mes clients cependant je ne pense pas que ce soit possible.
Ai-je tord ou raison ?

Merci d'avance !
tsubasa62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 14h47   #2
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Bonjour,


Donnez plus d'info votre problème n'est pas comptréhensible présenté comme ceci.

Entre autre :
- requete actuel
- jeux de donnée minimal pour comprendre ce que l'on a en entré et en sortie
- structure des tables
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 14h59   #3
Invité régulier
 
Homme Sylvain
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 5
Points : 5
Exemple table :

Table Client :
id int(10) PRIMARY KEY
nom varchar(25)
prenom varchar(25)

Table Achat :
id int(10) PRIMARY KEY
article varchar(25)
quantite int(2)
external_client_id int(10) FOREIGN KEY (vers id client)

Exemples table client :
1 - Albert - Monaco
2 - Super - Milka
3 - Hyper - Marché

Exemples table achat :
1 - Carotte - 2 - 1
2 - Poil - 1 - 1
3 - Super - 4 - 3
4 - Jambon - 1 - 2
5 - Jambe - 2 - 2
6 - DVD - 1 - 3

Je veux le deuxième achat de tous mes clients donc voilà le résultat :
Albert - Monaco - Poil - 1 (pour Albert Monaco son deuxième achat c'est 1 poil)
Super - Milka - Jambe - 2 (Pour Super Milko son deuxième achat c'est 2 jambes (vu qu'une c'est pas pratique))
Hyper - Marché - DVD - 1 (Pour Hyper Marché son deuxième achat c'est 1 DVD)

Pour l'exemple de requête c'est difficile parce que je demande si cette requête est possible.
tsubasa62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 15h02   #4
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Comment reconnait-on le "4eme achat" ?
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 15h19   #5
Invité régulier
 
Homme Sylvain
Inscription : mars 2011
Messages : 7
Détails du profil
Informations personnelles :
Nom : Homme Sylvain
Localisation : France, Nord (Nord Pas de Calais)

Informations professionnelles :
Secteur : Service public

Informations forums :
Inscription : mars 2011
Messages : 7
Points : 5
Points : 5
C'est le 4ème id achat pour son external_client_id ou alors si tu préféres on rajoute un champ date dans la table achat.
tsubasa62 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 15h44   #6
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
disons que sans fonction de fenêtrage c'est pas simple du tout.

Une solution, mais qui ne marchera pas si votre table est volumineuse (perf déplorable) :
Code :
1
2
3
4
5
6
7
 
SELECT *
FROM (
SELECT b.*, (SELECT count(*) FROM t_achat c WHERE a.id = c.cli_id AND c.id <= b.id) AS rnk
FROM t_client a
INNER JOIN t_achat b ON a.id = b.cli_id) t
WHERE rnk = 2
A creuser...

Ceci me semble mieux :
Code :
1
2
3
4
5
6
7
8
 
SELECT * FROM (
SELECT a.id, a.cli_id
FROM t_achat a
INNER JOIN t_achat b ON a.cli_id = b.cli_id AND a.id >= b.id
GROUP BY a.id, a.cli_id
HAVING count(*) = 2) t 
INNER JOIN t_achat b ON t.id = b.id ;
=> Remplacer le having count(*) par le nième élément voulu.
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 15h56   #7
Membre éclairé
 
Femme
Développeur .NET
Inscription : avril 2009
Messages : 264
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2009
Messages : 264
Points : 323
Points : 323
Pourquoi pas simplement :

Code :
1
2
 
SELECT * FROM matable LIMIT 1 OFFSET 4
?

(syntaxe postgreSQL mais adaptable à d'autres)
Isythiel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 15h58   #8
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
car il veut ce résultat pour chaque client
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 16h11   #9
Membre éclairé
 
Femme
Développeur .NET
Inscription : avril 2009
Messages : 264
Détails du profil
Informations personnelles :
Sexe : Femme
Localisation : France, Marne (Champagne Ardenne)

Informations professionnelles :
Activité : Développeur .NET
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : avril 2009
Messages : 264
Points : 323
Points : 323
Et un truc du genre :
Code :
1
2
3
4
5
 
SELECT * FROM clients c1
LEFT JOIN achats b ON c1.id = achats.id_client
AND achats.id IN 
    (SELECT achat.id FROM achats WHERE achats.id_client = c1.id LIMIT 1 OFFSET 4)
? (pas testé)
Isythiel est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/12/2011, 16h19   #10
Expert Confirmé
 
Homme
Inscription : mai 2002
Messages : 1 655
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 29
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : mai 2002
Messages : 1 655
Points : 2 657
Points : 2 657
Oui, effectivement une requête du genre fonctionenrai.

Par contre j'ai peur qu'elle soit aussi performante que la 1ere que j'ai posté.

A tester par l'op
punkoff est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h50.


 
 
 
 
Partenaires

Hébergement Web