[MySQL] Sélection précise d'entrées dans l'ordre, et doubles

Mammouth du PHP | 959 Messages

15 oct. 2009, 21:18

Bonsoir ! :)

Je bloque sur une requête: Je voudrais sélectionner des entrées précises, qui peuvent être sélectionnées 2 fois, et, tout en gardant l'ordre.

Exemple :
SELECT * FROM news WHERE id=18 OR id=5 OR id=50 OR id=5 OR id=3
Et je voudrais qu'elle me renvoie donc toutes les news (même les doubles), et le tout dans l'ordre où je l'ai énuméré dans la requête.

Merci d'avance ! ;)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 oct. 2009, 22:05

Quel est le but de cette manœuvre ? En terme de fonctionnalité ?

Mammouth du PHP | 959 Messages

15 oct. 2009, 22:20

C'est qu'en fait, le produit (ou la news dans mon exemple) doit pouvoir être affichée 2 fois, et le tout dans l'ordre. C'est un peu difficile à expliquer dans le contexte de mon application ...
Si tu veux, c'est un peu comme une caisse de magasin :
Imagine que l'association des code barres, du nom du produit et de son prix se face avec MySQL.
Et qu'a chaque fois que la caissière scanne un produit, ça ne fasse pas une requête à chaque fois, mais que ça envoi une grosse requête à la fin.
Eh bien ça serait bien de pouvoir acheter plusieurs fois le même produit, et de garder l'ordre de scannage du produit, que ça soit pas tout mélanger, c'est-à-dire, classer dans l'ordre croissant du code-barres quoi ...

J'espère que c'est plus clair :)

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

15 oct. 2009, 23:30

C'est pas parfait mais c'est déjà mieux : tu devrais toujours expliquer ton but, et pas arriver avec un début de solution bancale. En sachantp ourquoi tu veux faire ça, on peut t'aider à trouver la meilleure solution :P

Parceque là on voit que ce que tu veux c'est compter plusieurs fois la même ligne, donc avoir une quantité quelque part. On ne sélectionne pas plusieurs fois une ligne dans un select. De même, ton order peut être conservé quelque part.

Donc tu devrais vraiment nous expliquer le contexte de ton appli, mais déjà là on pourrait voir un tableau de clé par exemple, à la fin tu connais le nombre de fois où est présente chaque clé, donc la quantité, et ton ordre si tu le veux. Si c'est un panier, tu peux stocker la clé étrangère vers ton produit, son ordre d'affichage et sa quantité.

1. Passage du code barre
2. Stockage code barre produit dans un tableau : clé = code barre, valeur = quantité. Si déjà présent, valeur incrémentée, sinon valeur initialisée.
3. Retour au 1. etc
4. Stockage du panier avec les codes barres stocké et leur quantité, calcul du prix etc.

Mais ton SELECT bizarre avec 2 fois la condition "id = 5" pour sélectionner deux fois la même ligne, tu peux oublier ça n'a pas de sens. D'ailleurs tu le sais bien, tu sais quand même que derrière le WHERE ce sont des conditions de filtrage... rien de plus. L'ordre non naturel et la quantité sont des informations, elles doivent correspondre à quelque chose dans ta base.

Mammouth du PHP | 959 Messages

16 oct. 2009, 17:09

Merci de ta réponse, à tête reposée, j'ai fini par trouver une solution, non, pas celle de la requête dans la boucle :mrgreen:

1) Je fais une requête avec le WHERE, et la série de OR à la suite...
2) Je fais une boucle avec le mysql_fetch_array(), et je stocke les données, bien organisées, dans un array.
3) Je fais un foreach sur le panier qui contient les codes barres (dans l'ordre et double possible)
4) Et je pioche les informations sur le produit associé au code-barres dans l'array crée à l'étape 2)

C'est peut-être pas la meilleure des solutions, mais ça fonctionne parfaitement sans prendre trop de ressources, et sans trop se casser la tête en changeant pas trop la structure pour ça ;)

Merci !

ViPHP
fab
ViPHP | 2657 Messages

16 oct. 2009, 17:28

Mais ton panier il est bien stocké quelque part en base non ? Et tu arrives bien à le récupérer dans l'ordre qui t'intéresse ?
Si oui dans cette requête tu peux ajouter un LEFT JOIN avec comme condition de jointure l'association produit code barre non?

Ainsi que tu auras une seule requête, pas besoin d'array et les résultats dans l'ordre que tu veux :)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 959 Messages

16 oct. 2009, 17:35

Non, en fait mon panier est stocké en session, désolé d'avoir oublié de le préciser :)

ViPHP
fab
ViPHP | 2657 Messages

16 oct. 2009, 17:46

Ah ok :) Donc effectivement tu as pris une bonne méthode, dans ton WHERE tu as bien fais attention par contre à avoir qu'une seule fois chaque ID ? Au passage si tu dois faire :
WHERE id = 1 OR id = 2 OR id =3 etc...
c'est plus agréable d'avoir un :
WHERE id IN(1,2,3)

:)
Seul l'intelligent a le pouvoir de se trouver con
try { work(); } catch(FlemmeExeption $e) { sleep(84600); }

Mammouth du PHP | 959 Messages

16 oct. 2009, 18:26

Ah :) Je ne connaissais pas cette méthode, ça marche aussi :)
Et, oui, je fais un array_unique() sur le panier, pour éviter que des code-barres y soit 2 fois dans la série des OR :P

Merci !