afficher un résultat commun

Eléphant du PHP | 89 Messages

11 juil. 2007, 00:16

Bonjour à tous

Je posséde une table sous cette forme

CLIENT | PRODUITS
DUPONT | lecteur DVD TOSHIBA
DURAND | HOME CINEMA HITACHI
DUBOIS | CAISSON BOOSE
MARTIN | lecteur DVD TOSHIBA
DUBOIS | LCD Sony

Quelle pourrait etre la requête Mysql pour afficher les produits communs achetés par des clients différents?

Résultat:
Lecteur DVD TOSHIBA
DUPONT
MARTIN

Merci d'avance

ViPHP
ViPHP | 5924 Messages

11 juil. 2007, 01:00

Code : Tout sélectionner

SELECT produit FROM table table_u1 JOIN table table_u2 ON table_u1.produit = table_u2.produit WHERE table_u1.client='machin' AND table_u2.client='truc'
Ou bien :

Code : Tout sélectionner

SELECT produit FROM table WHERE client='machin' AND produit IN( SELECT produit FROM table WHERE client='truc')
Mais c'est une solution de facilité, et qui plus est, moins performante à mon humble avis.

Au passage, il faut mettre un index sur la colonne client du coup pour optimiser les requètes, et si possible un index numérique plutôt qu'une chaine...

Eléphant du PHP | 89 Messages

11 juil. 2007, 01:16

en selectionnant un client, j'y suis arrivé!
mais j'aimerais lister tous les clients ayant acheté un produit similaire en fait la condition est "si colonne produit >1"

Mammouth du PHP | 19672 Messages

11 juil. 2007, 07:30

utilise une clause HAVING COUNT(nom-colonne) > 1
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

ViPHP
ViPHP | 5924 Messages

11 juil. 2007, 15:49

Le produit est connu ou bien il faut le faire pour tout le monde et tous les produits ?

Eléphant du PHP | 89 Messages

11 juil. 2007, 17:01

justement le produit est inconnu (sur une base de plusieurs milliers de produit). je voudrais que la requete me fasse ressortir les produits communs achetés par des clients différents!

ViPHP
ViPHP | 5924 Messages

11 juil. 2007, 17:02

Ca va couter cher en ressources ca si tu n'a pas de conditions ni sur le client, ni sur le produit...

Eléphant du PHP | 89 Messages

12 juil. 2007, 10:00

En fait je voudrais simplement faire des statistiques (ce que permet une base de données), savoir quel est le produit le plus populaire et envoyer des bons de réduction aux clients ayant acheté ce produit!

La requête en bon français est:
selectionne les produits dans la table vente
quand le client est supérieur à un
groupe les par produits
ordonne les par produits les plus achetés

ViPHP
ViPHP | 5924 Messages

12 juil. 2007, 14:41

Essaye ca :

Code : Tout sélectionner

SELECT produit, COUNT(produit), GROUP_CONCAT(client) FROM table GROUP BY produit ORDER BY COUNT(produit) DESC

Eléphant du PHP | 89 Messages

12 juil. 2007, 16:25

Merci Sékiltoyai pour le GROUP_CONCAT!

Voilà la réponse (en fait il faut créer une table temporaire!)

Code : Tout sélectionner

CREATE TEMPORARY TABLE temp SELECT DISTINCT client,produit FROM `vente` WHERE client >1; SELECT produit, count(produit ),GROUP_CONCAT(client) FROM temp GROUP BY produit HAVING count( produit ) >1 ORDER BY produit DESC
RESULTATS
produits | nombre | clients |
Lecteur DVD TOSHIBA| 2 | DUPONT, MARTIN|

ET c'est parti pour les stats de la mort!!!!!!!!!!!!

ViPHP
ViPHP | 5924 Messages

12 juil. 2007, 16:28

Ca veut dire quoi "WHERE client >1;" ? Ton champ client, c'est un varchar, non ?

Eléphant du PHP | 89 Messages

12 juil. 2007, 16:37

Oui c'est vrai cette condition ne sert à rien, je viens de l'enlever est le résultat est le même!
En fait j'aurais pu écrire

Code : Tout sélectionner

WHERE client IS NOT NULL
mais en fait le champ client est NOT NULL par défaut!

ViPHP
ViPHP | 5924 Messages

12 juil. 2007, 16:39

Ta table temporaire ne sert à rien alors. Et ca bouffe des ressources.