8722 sujets

Développement web côté serveur, CMS

Bonjour,
J'ai une table produits, et j'essaye de savoir qu'elles sont les produits qui ont le même prix.
Pour cela j'ai fait la requête suivante :


SELECT *
FROM produits AS pr1
JOIN produits AS pr2
ON pr1.prix = pr2.prix
WHERE pr1.id <> pr2.id


Le problème c'est que ça me retourne deux fois le même résultat.

Cordialement
Modifié par o-o (05 Jul 2014 - 11:33)
ça te retourne en fait une fois la valeur sur p1 et une fois la valeur sur p2.

Si tu veux n'avoir qu'une seule table retournée, il faut sélectionner juste les champs de cette table-là (soit p1.*)
La relation d'équivalence est symétrique. Autrement dit si P1 a le même prix que P2, P2 a nécessairement aussi le même prix que P1. Du coup on reçoit effectivement deux lignes avec la même information.

C'est très facile de s'en rendre compte :
create table test (
name varchar(255) not null,
price int not null,
primary key(name));

insert into test (name, price) values
('Toto', 10),
('Tata', 20),
('Titi', 10),
('Tutu', 20),
('Bobo', 10),
('Yoyo', 30);

select t1.name as name1, t2.name as name2, t1.price
from test t1
join test t2 on t1.price = t2.price
where t1.name != t2.name;

drop table test


Si on exécute l'exemple, on voit qu'on a une ligne avec titi et toto, puis une ligne avec toto et titi; pareil avec et vers bobo, et entre tutu et tata dans les deux sens. C'est assez logique si on sait que les tables impliquées dans la jointure sont basiquement parcourues linéairement.

Il suffit de restreindre la condition sur la clé pour faire disparaître les doublons :

where t1.name < t2.name;

Car alors on ne peut jamais avoir à la fois P1<P2 et P1>=P2.

Si le but est de récupérer en une seule ligne tous les produits qui ont un prix identique et de grouper les produits par leur prix, on peut aussi utiliser group_concat :

select group_concat(distinct p1.id) as ids, price
from products p1
join products p2 on p1.price = p2.price
where p1.id!=p2.id
group by price