Newsgroup: it.comp.www.php
Titolo: Oridnamento mysql

Forse la domanda č stupida ma non so se sia possibile.
Ho una query cosě composta:
SELECT id,nome,cap,libero FROM affiliati WHERE cap=00143 OR cap=00128 OR
cap=00144 OR cap=00127 OR cap=00148 OR cap=00149 OR cap=00146 OR cap=00145
OR cap=00147 OR cap=00142 ORDER BY libero
Ora mi farebbe tanto ma veramente TAAAAANTO comodo che i risultati fossero
ordinati oltre che secondo il campo "libero" anche secondo l'OR con cui
vengono richiesti, nel caso specifico prima tutti quelli con 00143, poi
00128, poi 00144 e cosě via.... ditemi che č possibile.
Grazie, Stefano

 00128, poi 00144 e così via.... ditemi che è possibile.
No, non e` possibile.
E comunque, sei OT. :P
Bye.

00128, poi 00144 e cosě via.... ditemi che č possibile.
ORDER BY libero,cap
...ah, prima 00143 e poi 00128? Uh!
	$caps	= array('00143','00128','00144','00127',...);
	foreach($caps as $cap)
		$in[] = "'$cap'";
	$sqlcap	= implode(',', $in);
	$SQL =  "SELECT id, nome, cap, libero FROM affiliati WHERE ";
	$SQL .= "cap IN ($sqlcap) ORDER BY libero, FIELD($sqlcap);";
Pero' questo ti funziona solo in MySQL, credo.
Leonardo
-- 
Geordie - he's a man, there's little doot about't,
He's done all he can, wha' can do withoot't?
Doon there cam a blade, linkin' like me lordie,
He wad drive a trade, a' the loom of Geordie.

		$in[] = "'$cap'";
Leonardo correggentesi


Alessandro Pellizzari ha scritto:

Nulla è impossibile a... SQL!
In teoria si può fare.. usando delle viste, poi dei join con tabelle 
temporanee... e alla fine una select...
Diciamo, al posto di impossibile, molto complesso.
Ciao!
;-)
Sir

 Leonardo correggentesi
A sto punto gli conviene fare una cosa + semplice, sia in PHP che in SQL.
//1 . costruisco array di cap ordinato (PHP)
//2 . costruisco dinamicamente la query (PHP)
//3 . la eseguo (SQL)
---
//1
$caps = ("0023", "0021", "0022");
$caps = sort_in_qualche_modo
//2
forech ($caps as $cap) {
	$query .= "(SELECT .... FROM .... WHERE CAP = $cap)";
	$query .= " UNION ";
}
NB: attenzione all'ultima UNION che rimane scoperta...
//3
exequery...
OK?
Dovrebbe andare, no??
Sir

 00128, poi 00144 e cosě via
Non e' il massimo dell'efficienza ma questa e' una soluzione al problema 
specifico:
SELECT `id`,`nome`,`cap`,`libero`
FROM `affiliati`
WHERE `cap` IN 
('00143','00128','00144','00127','00148','00149','00146','00145','00147','00142')
ORDER BY libero ASC,
      `cap` IN 
('00143','00128','00144','00127','00148','00149','00146','00145','00147','00142') 
DESC,
      `cap` ASC
Inutile aggiungere come costruire programmaticamente la stringa di sopra :)
Due raccomandazioni:
1) Crea un indice su CAP.
2) Confronta CAP con il tipo di dato corretto:
Se CAP e' (come presumibile) un VARCHAR(5) usa una stringa fra apici per i 
confronti. Se non lo fai obblighi MySQL a fare conversioni implicite da INT 
(00143 = 143) a VARCHAR ('143') ottenendo, magari, anche risultati inattesi. 
Se viceversa il campo CAP e' un INT(5) o similare leva gli apici ' dalla 
query che ho postato, ma considera che 00143 verra' interpretato come il 
NUMERO 143 e non come una stringa.
hth,
Lokar 



La tua soluzione funziona in parte in quanto a me interessava ottenere
ANCHE l'ordinamento della colonna "libero", mentre cosě ho si' l'ordine per
cap ma mi trovo mischiati quelli con 1 e 0 nel campo "libero".
Inoltre cosě facendo non č come fare n query sul database?
Grazie lo stesso comunque.

 Pero' questo ti funziona solo in MySQL, credo.
Questo č la SELECT che ne esce
SELECT id_affiliato, nome, cap, libero FROM affiliati WHERE cap IN
(00134,'00143','00128','00144','00127','00148','00149','00146','00145','00147','00142')
ORDER BY libero,
FIELD(00134,'00143','00128','00144','00127','00148','00149','00146','00145','00147','00142');
Purtroppo non ottengo nessun ordinamento in base ai cap ma solo in base
alla colonna "libero", mi sa che con un solo colpo non č proprio possibile.
Grazie lo stesso.

 possibile.
Provato il mio codice?
Lokar 

 specifico:
Allora ho provato anche il tuo esempio questo č il risultato:
la query risultante č questa:
SELECT id_affiliato, nome, cap, libero FROM affiliati WHERE cap IN
(00134,'00143','00128','00144','00127','00148','00149','00146','00145','00147','00142')
ORDER BY libero ASC, cap IN
(00134,'00143','00128','00144','00127','00148','00149','00146','00145','00147','00142')
DESC, cap ASC;
Il risultato questo:
nome/cap/libero
nnn/00127/0
ttt/00127/0
eee/00128/0
fff/00128/0
lillo/00144/0
bbb/00144/0
hhh/00144/0
kjh lkjh lkj/00145/0
prova 2/00145/0
ooo/00145/0
vvv/00146/0
iii/00148/0
mmm/00148/0
sss/00148/0
rrr/00149/0
iii/00127/1
pippo/00143/1
ggg/00143/1
aaa/00144/1
zzz/00145/1
uuu/00146/1
lll/00148/1
Come vedi l'ordine non č corretto in quanto salta da un cap all'altro senza
seguire l'ordine di IN.
Al mento ho "risolto" con la query di UNION per trovare in modo ordinati
queli con il campo "libero"=0 e poi un'altra query per avere quelli con il
campo "libero"=1, entrambe ordinate per cap di ingresso.
La soluzione č decisamente scomoda e dispendiosa, sarei sempre felicissimo
se riuscissi a fare tutto in una "botta".
Grazie mille. Stefano

 DESC, cap ASC;
Mancano degli apici su 00134.
Ora popolo il mio db di test e provo la query con dei dati...
A presto,
Lokar

[SNIP]
Non mi spiego perche' non funzioni con IN (...).
In ogni caso ecco un'alternativa funzionante e programmaticamente fattibile.
SELECT `nome`, `cap`, `libero`,
   cap='00134' AS `o1`,
   cap='00143' AS `o2`,
   cap='00128' AS `o3`,
   cap='00144' AS `o4`,
   cap='00127' AS `o5`,
   cap='00148' AS `o6`,
   cap='00149' AS `o7`,
   cap='00146' AS `o8`,
   cap='00145' AS `o9`,
   cap='00147' AS `o10`,
   cap='00142' AS `o11`
FROM `affiliati`
WHERE cap='00134'
   OR cap='00143'
   OR cap='00128'
   OR cap='00144'
   OR cap='00127'
   OR cap='00148'
   OR cap='00149'
   OR cap='00146'
   OR cap='00145'
   OR cap='00147'
   OR cap='00142'
ORDER BY `libero` ASC,
         `o1` DESC,
         `o2` DESC,
         `o3` DESC,
         `o4` DESC,
         `o5` DESC,
         `o6` DESC,
         `o7` DESC,
         `o8` DESC,
         `o9` DESC,
         `o10` DESC,
         `o11` DESC
Se ti danno noia i campi in piu' puoi sempre aggiungere all'inizio della 
query:
SELECT `A`.`nome`, `A`.`cap`, `A`.`libero` FROM (
e alla fine:
) AS `A`
hth,
Lokar 

alla colonna "libero", mi sa che con un solo colpo non č proprio possibile.
Scusa, forse ho capito male io: puo' essere che tu intendessi PRIMA
ordinare per CAP, e POI per libero?
In quel caso ti basta cambiare la riga:
	$SQL =  "SELECT id, nome, cap, libero FROM affiliati WHERE ";
	$SQL .= "cap IN ($sqlcap) ORDER BY FIELD($sqlcap), libero;";
Cosi' se hai, per esempio,
	CAP	libero
	10000	1
	10020	2
	10030	3
	10000	2
	10020	7
	10030	5
ti dara'
	10000	1
	10000	2
	10020	2
	10020	7
	10030	3
	10030	5
Se non funziona nemmeno cosi', fai una santa cosa: prepara nove record con
tre CAP diversi, ordinali come piu' ti piace e fammeli vedere :-)


 Grazie lo stesso comunque.
Se ti interessa l'ordinamento nessun problema.
Monti sopra la cascata di union una query, in questo modo...
SELECT ID, NAME, COGNOME, ECC...
FROM ...
WHERE ID IN (cascata di union)
ORDER BY ID (o quello che vuoi)
E poi.. NO, non č come fare N query.
La query č una sola, magari solo 1 pň piů lenta, dipende da come puň 
essere ottimizzata.
Ciao!
Sir

Stefano wrote:

http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
 
-- 
www.iuz-lab.info

 In ogni caso ecco un'alternativa funzionante e programmaticamente fattibile.
PERFETTO!!!!! GRAZIE MILLE!!! funziona alla grande (anche se non ho capito
il perchè).
Ciao Stefano