Order By un peu spécial !

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Order By un peu spécial !

par Cyrano » 03 avr. 2006, 17:52

J'aurais appris un truc très utile sur ce forum (une fois n'est pas coutume) :langue:

par Hubert Roksor » 03 avr. 2006, 17:46

Ma première requête devrait marcher sur toutes les versions de MySQL >= 3.23, la seconde requête devrait marcher sur à peu près tous les serveurs de base de données. CASE est très portable, c'est ce que j'utilise à la place de IF() chez MySQL. D'ailleurs, dans la série "SQL portable" (sic):

Code : Tout sélectionner

SELECT IF(foo > 10, bar, baz) AS one, IFNULL(foo, bar) AS two
devient:

Code : Tout sélectionner

SELECT CASE WHEN foo > 10 THEN bar ELSE baz END AS one, COALESCE(foo, bar) AS two

par ouckileou » 03 avr. 2006, 16:55

Ça marche sur des versions inférieures à 5.0 ça ? :shock:
Normalement oui, j'avais fait plus ou moins la même chose et y'avait pas de problème ;)

par Cyrano » 03 avr. 2006, 16:54

J'aurais une meilleure solution à proposer
Ça marche sur des versions inférieures à 5.0 ça ? :shock:

par Hubert Roksor » 03 avr. 2006, 16:13

J'aurais une meilleure solution à proposer, celle-ci:

Code : Tout sélectionner

SELECT * FROM products ORDER BY (mark = 'SONY') DESC, price ASC
Normalement, (mark = 'SONY') équivaut à 1 ou 0 selon si c'est vrai ou faux. Au fait, pour info "marque" se traduit par "brand" ;)

On peut étendre la technique à plusieurs marques si nécessaire, et ajouter une sorte de mini-classement supplémentaire. Par exemple, les appareils SONY en premier, puis TOSHIBA:

Code : Tout sélectionner

SELECT *, CASE mark WHEN 'SONY' THEN 2 WHEN 'TOSHIBA' THEN 1 ELSE 0 END AS rank FROM products ORDER BY rank DESC, price ASC

par Mamouth » 03 avr. 2006, 11:36

Problème résolu !

MERCI :lol:

par ouckileou » 03 avr. 2006, 11:17

Est-ce que c'est Résolu ?

Je déplacerai aussi le sujet dans le forum BDD

par Mamouth » 03 avr. 2006, 11:15

C'est ok, ca fonctionne, mais le script exact etait :

$ids = mysql_query("(SELECT * FROM products WHERE mark='SONY' ORDER BY prices) UNION (SELECT * FROM products ORDER BY prices)");
while($ids_tab = mysql_fetch_array($ids))

par Tictac » 03 avr. 2006, 11:01

Essaye comme ceci =>
$ids = mysql_query("(SELECT * FROM products WHERE mark='SONY') UNION (SELECT * FROM products) ORDER BY prices");  

par Mamouth » 03 avr. 2006, 10:55

Merci Mario, et merci à vous tous de votre rapidité !
j'ai testé le union, mais je dois mal l'utiliser :

$ids = mysql_query("SELECT * FROM products WHERE mark='SONY' ORDER BY prices UNION SELECT * FROM products ORDER BY prices");
while($ids_tab = mysql_fetch_array($ids))

merci

par Tictac » 03 avr. 2006, 10:45

par mario » 03 avr. 2006, 10:38

SELECT * FROM products WHERE mark='SONY'
UNION
SELECT * FROM products


sort les produits de marque SONY en tête

par Ziwa » 03 avr. 2006, 10:36

Attend tu ne veux pas sortir tout les produits de toutes les marques? ou tu veux tout les produits? ta phrase est contradictoire avec ton mais


Si tu veux les produits de la marque sony par odre croissant ou decroissant de prix
Select * from PRODUITS where marque="SONY" order by prices ASC/DESC

par Tictac » 03 avr. 2006, 10:32

comme toi tu fais mario , il va juste sortir les prix pour la marque sony ;)

lui veut tout les prix mais sony en premier

par Mamouth » 03 avr. 2006, 10:28

L'histoire c'est que je veus sortir TOUS les produits de TOUTES les marques, mais mettre en tête les produits de la marque SONY.

Désolé si je ne suis pas clair