Newsgroup: it.comp.www.php
Titolo: Prb con query mysql (solo per qualcuno che si vuol scervellare un po'!)

Nel mio db ho questa tabella:
*****************
* ID * Descr * Flag *
*****************
*  1 * Uno   *    0 *
*  2 * Due   *    1 *
*  3 * Tre   *    1 *
*****************
E devo scrivere una query che dia come risultato:
***********
* ID * Descr *
***********
*  1 * Uno   *
*  2 * Due   *
*  2 * Due-1 *
*  3 * Tre   *
*  3 * Tre-1 *
***********
In pratica deve riportare due volte i records che hanno il campo flag
impostato ad 1 concatenando alla descrizione il '-1'.
I vincoli (che purtroppo non posso alterare) sono:
1. che la query deve essere "semplice" ossia deve contenere una clausola
SELECT, una clausola FROM ed eventualmente una clausola WHERE (in pratica è
bandito l'uso di UNION).
2. che devo eseguire il tutto all'interno di un'unica interrogazione SQL
(non posso cioè eseguire una SELECT * FROM tabProva e quindi usare php per
ciclare su tutti i risultati duplicando quelli che servono).
Per il primo vincolo la query seguente non è quindi applicabile:
SELECT ID, Descr
FROM tabProva
UNION
SELECT ID, CONCAT(Descr, '-1') AS Descr
FROM tabProva
WHERE Flag=1
Allora avevo pensato ad una soluzione di questo tipo (in questo caso la
UNION la uso all'interno della clausola FROM e questo è concesso!):
SELECT ID, CONCAT(Descr, momDescr) AS Descr
FROM tabProva INNER JOIN (
    SELECT 0 AS momFlag, '' AS momDescr
    UNION
    SELECT 1 AS momFlag, '-1' AS momDescr
) tabMom ON tabProva.Flag<=tabMom.momFlag
Purtroppo però MySql 4.0.15 non supporta le query nidificate e quindi non
funziona!
Qualcuno può indicarmi un'altra soluzione?
Grazie dell'interessamento, ciao.
    Andrea

 servono).
Perche?
-- 
I am what I am, I do what I can
Sei un newbie? Leggi questo 
http://url.repository.biz/go/1
Inviare email con allegati? 
http://url.repository.biz/go/x

 Perche?
Perchè sto' lavorando in team ad un progetto che non ho totalmente "in mano"
e mi ritrovo a passare ad un oggetto php una clausola SELECT, una clausola
FROM ed una clausola WHERE (l'oggetto php fa' dei controlli sulle clausole,
fa' chissà quali altre cose, quindi compone il codice sql e lo esegue).
Sto' cercando di risolvere il problema senza mettere "in moto" altre persone
affinchè modifichino l'oggetto (li obbligherei a correggere la
documentazione, l'oggetto, rieffettuare i test del caso, ...)
Qualche idea su come risolvere il problema nell'ambito di questi vincoli?
(purtroppo MySql 4.1 è ancora Alpha... non mi pare il caso di utilizzarlo!)
Grazie per la tempestività nella tua risposta!
Ciao.
    Andrea

 rieffettuare i test del caso, ...)
Ok, ma che cosa restituisce l'oggetto? Se stai lavorando con OO puoi
sempre derivare una sotto classe che eredita le funzioni di base ed
implementi via codice quello che ti serve.
Utilizzare UNION o SUB SELECT non e' il massimo in quanto limiti la
portabilita' del codice in modo sensibile (solo MySQL > 4.1 etc.).
UNION e SUB SELECT sono le uniche soluzioni che mi vendono in mente.


 UNION e SUB SELECT sono le uniche soluzioni che mi vendono in mente.
Già... purtroppo anche a me... speravo che mi sfuggisse qualcosa!
Beh... vedrò di marcirmi the brain ancora un po'; mal che vada genero una
request e richiedo la modifica all'oggetto...
Grazie ancora Setec
Ciao!
    Andrea

Barlume di speranza: potrei creare una tabella temporanea che contiene due
record (uno con scritto 0 e l'altro con scritto 1) e usarla al posto di
tabMom... però sarebbe una soluzione bruttissimissima!!! Sai per caso se
esista qualche tabella di sistema che restituisca dei numeri?

 Server!!! 
MySQL non e (era) un RDBMS, ma solo un DBMS. Non supporta (supportava)
la maggior parte delle cose richieste da un database relazionale
(integrita' referenzale, trigger, stored proc, sub select, union etc.
etc.)-


 che restituisca dei numeri?
Che cosa intendi per "tabella di sistema che restituisca dei numeri"?


> Che cosa intendi per "tabella di sistema che restituisca dei numeri"?
Boh... qualsiasi tabella che contenga un campo del tipo:
***********
 ... * Fld * ...
***********
 ... * ...  * ...
 ... *  1  * ...
 ... *  2  * ...
 ... * ...  * ...
Insomma potrei fare una query del tipo (resta da trattare il campo Descr in
modo che vi sia concatenato '-1' ma quello non è un problema!):
SELECT ID, Descr
FROM tabProva INNER JOIN tabSys ON tabProva.Flag<=tabSys.Fld-1 AND (tabSys=1
OR tabSys=2)
Ad esempio in M$ Sql Server nel db master (il db di sistema) esisteva una
tabella che riportava la trascodifica dei tipi di campo (ad esempio
riportava che adVarchar valeva 8, che adChar valeva 5, ...) se esiste una
tabella del genere potrei usare come Fld il campo progressivo...
(che ne dici? è troppo grosso come acrocchio?)  ;-)

 (che ne dici? h troppo grosso come acrocchio?)  ;-)
Si, penso sia troppo grosso.
Soluzione alternativa:
Tabella temporanea
Insert di tutti i record da tabProva 
Insert dei soli record da tabProva che hanno Flag = 1
(Descr=CONCAT(Descr, '-1')).
Passi all'oggetto la tabella temporanea.


 Passi all'oggetto la tabella temporanea.
Già... E' la soluzione simile a quella a cui accennavo 2 o 3 post fa'... (oh
jesus... quanto odio le tabelle temporanee!!!)  ;-)
Comunque sembra sia l'unica soluzione "decente" (per modo di dire!) ...
Beh, grazie dell'attenzione Setec... Alla prox!
Ciao!