Newsgroup: it.comp.www.php
Titolo: E' possibile referenziare una select in mysql?

Ciao a tutti.
Il mio problema piů che di php č relativo a mysql.
Devo effettuare delle query piuttosto complicate su un db mysql.
La cosa si faciliterebbe molto se potessi fare delle SELECT a cascata,
utilizzando nelle SELECT successive i risultati delle SELECT precedenti.
Esempio
select1 = SELECT id FROM tab;
select2 = SELECT id FROM select1 WHERE id = 2;
(l'esempio č scemo lo so, serve solo per rendere l'idea).
Mi chiedevo inoltre: ma la clausola IN non puň essere usata per determinare
l'appartenenza o meno ad una SELECT?
Esempio:
SELECT id FROM tab1 WHERE id IN (SELECT id FROM tab2);
Informazione che magari č utile, la versione di Mysql sul server č la
3.23.49 e non mi č possibile cambiarla.
Grazie a tutti in anticipo.
Bye
giaconet

 SELECT id FROM tab1 WHERE id IN (SELECT id FROM tab2);
Che io ricordi, Mysql non permette query innestate, sebbene queste siano sql
standard.
Per fare una cosa del genere
   SELECT id FROM tab1 WHERE id IN (SELECT id FROM tab2);
devi fare 2 query:
1 - una per la select più interna
2 - un'altra per quella esterna
Ciao
Marco

 3.23.49 e non mi è possibile cambiarla.
Le subqueries sono disponibili in MySQL a partire dalla
versione 4.1: 
http://tinyurl.com/3bn3h
Ciao.
-- 
Federico R.


Ok, come le innesto? Come dico alla seconda query chi è la prima?
Grazie
giaconet

 SELECT id FROM tab1 WHERE id IN (SELECT id FROM tab2);
no, non č possibile, ma puoi fare delle join che hanno lo stesso
risultato...
SELECT 
a.id
 FROM tab1 a LEFT JOIN tab2 b ON 
a.id
 = 
b.id


Quindi non c'è speranza?
Grazie
giaconet


Ciao,
questo č un caso in cui le subselectnon servomo e non le userei neanche se
fosse possibile, ti puoi servire di una JOIN
Per riprendere il tuo esempio
"SELECT id FROM tab1 WHERE id IN (SELECT id FROM tab2);"
Puň ssere riscritto cosě
SELECT id FROM tab1
INNER JOIN tab2 ON 
tab1.id
 = 
tab2.id
Inoltre usando LEFT JOIN, RIGHT JOIN puoi fare diverse cose
Per ricerche sulla stessa tabella puoi fare un self JOIN
Prova a leggere anche qui
http://dev.mysql.com/doc/mysql/en/Rewriting_subqueries.html
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Ho avuto anche io la settimana scorsa il tuo stesso problema (query
innestate + not in) ma con la versione di mysql di easyphp non funzionava
(mi pare 3.2qualcosa) l'unica soluzione che ho trovato (vista la
complessita' della query) e' stata aggiornare mysql con la vers. 4.1 (che
supporta anche le relazioni anche se tra i vari ng si dice che non sono
importanti le relazioni, a me senza non andava una cippa)... per concatenare
2 select sarebbe ottimo se si potessero fondere i risultati es:
$ris1=mysql_query("Select id from pippo");
$ris2=mysql_query("select id from pluto");
$ris1 .= $ris2;
non ho provato, ma credo che non sia possibile...
al max, riesci a mettere i 2 risultati in un unico array...
se invece, devi filtrare una query con i risultati di un'altra usa cicli +
if
tutto questo secondo la mia poca esperienza, se ci sono altri metodi, la
cosa interessa pure a me :)
ciaooo
Dade

SELECT id FROM tab1 WHERE id IN (SELECT id FROM tab2);
si', ma a partire da mysql 4.1.*
Puoi usare, per risolvere il tuo problema, una tabella temporanea (che
rappresenta la tua "variabile" select1) e una join.
L'esempio lo trovi nella documentazione:
http://dev.mysql.com/doc/mysql/en/example-Maximum-column-group-row.html

 Quindi non c'è speranza?
Con MySQL 3.23.49 le subqueries non le puoi usare.
Spunti su come sostituirle: 
http://tinyurl.com/3so63
-- 
Federico R.

Di solito non rompo....
perň non trovo giusto che un cosě bel post sia nel NG sbagliato.
Esiste free.it.comp.database.mysql che sta li per tutti i problemi relativi
a MySQL.
Mica MySQL si usa solo con PHP. Questo POST potrebbe interessare a che a chi
sviluppa in ASP, PERL, VATTELAPESC...

> Ok, come le innesto? Come dico alla seconda query chi è la prima?
$listArr = array();
$rs = mysql_query("SELECT id FROM tab2"); // selezioni tutti gli id
while($row = mysql_fetch_array($rs))  // riempi un array
    $listArr[] = $row["id"];
$list = implode(",", $listArr);  // trasformi l'array in una stringa
$rs = "SELECT * FROM tab1 WHERE id IN ($list)";
Ciao
Marco