Page 1 sur 1

afficher un résultat commun

Posté : 11 juil. 2007, 00:16
par martial
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

Posté : 11 juil. 2007, 01:00
par Sékiltoyai

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...

Posté : 11 juil. 2007, 01:16
par martial
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"

Posté : 11 juil. 2007, 07:30
par Cyrano
utilise une clause HAVING COUNT(nom-colonne) > 1

Posté : 11 juil. 2007, 15:49
par Sékiltoyai
Le produit est connu ou bien il faut le faire pour tout le monde et tous les produits ?

Posté : 11 juil. 2007, 17:01
par martial
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!

Posté : 11 juil. 2007, 17:02
par Sékiltoyai
Ca va couter cher en ressources ca si tu n'a pas de conditions ni sur le client, ni sur le produit...

Posté : 12 juil. 2007, 10:00
par martial
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

Posté : 12 juil. 2007, 14:41
par Sékiltoyai
Essaye ca :

Code : Tout sélectionner

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

Posté : 12 juil. 2007, 16:25
par martial
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!!!!!!!!!!!!

Posté : 12 juil. 2007, 16:28
par Sékiltoyai
Ca veut dire quoi "WHERE client >1;" ? Ton champ client, c'est un varchar, non ?

Posté : 12 juil. 2007, 16:37
par martial
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!

Posté : 12 juil. 2007, 16:39
par Sékiltoyai
Ta table temporaire ne sert à rien alors. Et ca bouffe des ressources.