Escludere 2 select da una select

Mary Azzurro

Nuovo Utente
7 Feb 2013
14
0
0
Salve a tutti!

Ho qualche difficoltà a realizzare una select escludendo da questa i risultati di 2 select.
Mi spiego meglio, ho una tabella con 30 articoli.
Di questi articoli, una diecina hanno un valore "principale=1".

Vorrei creare una select che selezioni 15 articoli escludendo gli ultimi 5 che hanno "principale=1" e gli ultimi 4 che hanno "principale=0".

Qualcuno mi può aiutare?

All'interno della stessa pagina io ho già queste due select che andrebbero in qualche modo sottratte a questa nuova:
PHP:
$sql_art = "SELECT * FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4";
PHP:
$sql_slider = "SELECT * FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5";
 
Ciao, prova a vedere se cosi puo funzionare
Codice:
SELECT * FROM articoli
         WHERE idArticolo NOT IN (
               SELECT idArticolo FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4
               ) &&
               idArticolo NOT IN (
               SELECT idArticolo FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5
               )
provala direttamente nel SQL di phpmyadmin cosi vedi anche quanti secondi ci impiega
 
Ciao, prova a vedere se cosi puo funzionare
Codice:
SELECT * FROM articoli
         WHERE idArticolo NOT IN (
               SELECT idArticolo FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4
               ) &&
               idArticolo NOT IN (
               SELECT idArticolo FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5
               )
provala direttamente nel SQL di phpmyadmin cosi vedi anche quanti secondi ci impiega

Mi dice: This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'
:(

In realtà LIMIT funziona perché ho provato
Codice:
SELECT idArticolo FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4
e funziona.
 
Ultima modifica:
il messaggio dice che il LIMIT non è supportato nelle subquery
potresti allora costruirti una stringa in php che contenga gli id delle due query tipo
PHP:
$stringaid = "34,23,55,13,2,9";
e usarla per l'ultima query
PHP:
$query = "SELECT * FROM articoli WHERE idArticolo NOT IN (" . $stringaid . ")";
 
ciao
puoi provare così (al massimo non funzia)
PHP:
<?php
$sql_art = "SELECT * FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4";  
$sql_slider = "SELECT * FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5";
//$ris_... =mysql_query
$id_max=mysql_fetch_array($ris_art);
$id_max_0=$id_max['idArticolo'];
$id_max=mysql_fetch_array($ris_slider);
$id_max_1=$id_max['idArticolo'];

$query="SELECT * FROM articoli WHERE (principale='0' AND idArticolo < $id_max_0) OR (principale='1' AND idArticolo < $id_max_1) ORDER BY idArticolo LIMIT 15";
//......
?>

edit
limit funziona, ma non nelle subquery
 
Ultima modifica:
ciao
puoi provare così (al massimo non funzia)
PHP:
<?php
$sql_art = "SELECT * FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4";  
$sql_slider = "SELECT * FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5";
//$ris_... =mysql_query
$id_max=mysql_fetch_array($ris_art);
$id_max_0=$id_max['idArticolo'];
$id_max=mysql_fetch_array($ris_slider);
$id_max_1=$id_max['idArticolo'];

$query="SELECT * FROM articoli WHERE (principale='0' AND idArticolo < $id_max_0) OR (principale='1' AND idArticolo < $id_max_1) ORDER BY idArticolo LIMIT 15";
//......
?>

edit

Ho pr
limit funziona, ma non nelle subquery
Niente, così non va... i due array mi danno un solo id!

Ho provato quindi in questo modo:
PHP:
$sql_art = "SELECT * FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4";  
$sql_slider = "SELECT * FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5";
$ris_art = mysql_query($sql_art, $con) or die(mysql_error());
$ris_slider = mysql_query($sql_slider, $con) or die(mysql_error());

while($id_max=mysql_fetch_array($ris_art)){
$id_max_0[]=$id_max['idArticolo'];
}
$id_max_0=implode(",",$id_max_0);

while($id_max=mysql_fetch_array($ris_slider)){
$id_max_1[]=$id_max['idArticolo'];
}
$id_max_1=implode(",",$id_max_1);
$sql="SELECT * FROM articoli WHERE (idArticolo < $id_max_0) OR (idArticolo < $id_max_1) ORDER BY idArticolo LIMIT 15";
			   	$risultato = mysql_query($sql, $con) or die(mysql_error());

Se faccio un echo a $id_max_0 e $id_max_1, gli id da escludere ci sono tutti, ma lo script si blocca comunque con questo messaggio di errore
"Operand should contain 1 column(s)" :crying:
 
ciao
scusa una domanda, ti faccio un esempio. tu hai in tabella articoli
idArticolo - principale - ecc...
1 0
2 0
3 1
4 1
5 1
6 0
7 0
8 0
9 1
10 1
11 0
12 1
13 0
14 1
15 1
16 1
17 0
18 0
19 1
20 0
e vorresti ottenere
idArticolo - principale - ecc...
1 0
2 0
6 0
7 0
8 0
11 0
3 1
4 1
5 1
9 1
10 1
cioe escludere gli ultimi 4 con principale =0 e gli ultimi 5 con principale=1 giusto? con al massimo 15 risultati?
se è così, faccio un paio di prove e (spero) di saperti dire
 
ciao
scusa una domanda, ti faccio un esempio. tu hai in tabella articoli

e vorresti ottenere

cioe escludere gli ultimi 4 con principale =0 e gli ultimi 5 con principale=1 giusto? con al massimo 15 risultati?
se è così, faccio un paio di prove e (spero) di saperti dire
Esatto!!! Ti ringrazio!!! :D
Continua a provare anch'io... se riesco, posto! :)
 
ciao
nel precedente avevo fatto un piccolo errore di logica.
questo dovrebbe funziare
PHP:
<?php
//dati di connessione
$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = 'password';  //password
$db = 'prove';            // nome data base
//---connessione----------------------------------------------------
$conn = @mysql_connect($host,$username,$password) or die (mysql_error());
$sel = @mysql_select_db($db) or die (mysql_error());
/*ho creato la tabella
CREATE TABLE `articoli` (
`idArticolo` INT( 3 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`principale` VARCHAR( 1 ) NOT NULL
) ENGINE = MYISAM ;
*/
//ho riempito casualmente la tabella
//$q="INSERT INTO articoli(principale) SET('$principale')";
/*
for($k=0;$k<100;$k++){
	$principale=(int)rand(0,1);
	$q="INSERT INTO articoli(principale) VALUES('$principale')";
	//echo "$q<br>";
	if(mysql_query($q)){
		echo "$k inserito<br>";
	}else{
		echo "$k NON inserito<br>";
	}
}
*/
//cerco il min id sia per principale 0 e poi per 1
$ris_art = mysql_query("SELECT idArticolo FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4");
$ris_slider = mysql_query("SELECT idArticolo FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5");
//var_dump($ris_art);
//var_dump($ris_art);
//cerco per principale 0
while($riga=mysql_fetch_assoc($ris_art)){
	$id_max[]= $riga['idArticolo'];
}
//var_dump($id_max);
$id_max_0=min($id_max);
unset($id_max);//libero
//cerco per principale 0
while($riga=mysql_fetch_assoc($ris_slider)){
	$id_max[]= $riga['idArticolo'];
}
//var_dump($id_max);
$id_max_1=min($id_max);
unset($id_max);//libero
//var_dump($id_max_0);
//var_dump($id_max_1);
//estraggo i 15 risultati ho messo desc per vedere gli ultimi 15
$query="SELECT * FROM articoli WHERE (principale='0' AND idArticolo < $id_max_0) OR (principale='1' AND idArticolo < $id_max_1) ORDER BY idArticolo DESC LIMIT 15"; 
//var_dump($query);
$ris=mysql_query($query);
//var_dump($ris);
echo "<table style=\"text-align:center;\">";
echo "<tr><td> id articolo </td><td> principale </td></tr>";
while($riga=mysql_fetch_array($ris)){
	$id=$riga['idArticolo'];//qui dovra aggiungere i campi che ti servono
	$pr=$riga['principale'];
	echo "<tr><td> $id </td><td> $pr </td></tr>";
}
echo "</table>";
?>
ivari var_dump commentati mi sono serviti per le verifiche, eventualmente togli
 
ciao
nel precedente avevo fatto un piccolo errore di logica.
questo dovrebbe funziare
PHP:
<?php
//dati di connessione
$host = 'localhost';     //nome host
$username = 'root';      //user name
$password = 'password';  //password
$db = 'prove';            // nome data base
//---connessione----------------------------------------------------
$conn = @mysql_connect($host,$username,$password) or die (mysql_error());
$sel = @mysql_select_db($db) or die (mysql_error());
/*ho creato la tabella
CREATE TABLE `articoli` (
`idArticolo` INT( 3 ) NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`principale` VARCHAR( 1 ) NOT NULL
) ENGINE = MYISAM ;
*/
//ho riempito casualmente la tabella
//$q="INSERT INTO articoli(principale) SET('$principale')";
/*
for($k=0;$k<100;$k++){
	$principale=(int)rand(0,1);
	$q="INSERT INTO articoli(principale) VALUES('$principale')";
	//echo "$q<br>";
	if(mysql_query($q)){
		echo "$k inserito<br>";
	}else{
		echo "$k NON inserito<br>";
	}
}
*/
//cerco il min id sia per principale 0 e poi per 1
$ris_art = mysql_query("SELECT idArticolo FROM articoli WHERE principale='0' ORDER BY idArticolo DESC LIMIT 4");
$ris_slider = mysql_query("SELECT idArticolo FROM articoli WHERE principale='1' ORDER BY idArticolo DESC LIMIT 5");
//var_dump($ris_art);
//var_dump($ris_art);
//cerco per principale 0
while($riga=mysql_fetch_assoc($ris_art)){
	$id_max[]= $riga['idArticolo'];
}
//var_dump($id_max);
$id_max_0=min($id_max);
unset($id_max);//libero
//cerco per principale 0
while($riga=mysql_fetch_assoc($ris_slider)){
	$id_max[]= $riga['idArticolo'];
}
//var_dump($id_max);
$id_max_1=min($id_max);
unset($id_max);//libero
//var_dump($id_max_0);
//var_dump($id_max_1);
//estraggo i 15 risultati ho messo desc per vedere gli ultimi 15
$query="SELECT * FROM articoli WHERE (principale='0' AND idArticolo < $id_max_0) OR (principale='1' AND idArticolo < $id_max_1) ORDER BY idArticolo DESC LIMIT 15"; 
//var_dump($query);
$ris=mysql_query($query);
//var_dump($ris);
echo "<table style=\"text-align:center;\">";
echo "<tr><td> id articolo </td><td> principale </td></tr>";
while($riga=mysql_fetch_array($ris)){
	$id=$riga['idArticolo'];//qui dovra aggiungere i campi che ti servono
	$pr=$riga['principale'];
	echo "<tr><td> $id </td><td> $pr </td></tr>";
}
echo "</table>";
?>
ivari var_dump commentati mi sono serviti per le verifiche, eventualmente togli

EVVIVA!!! Funziona!!! Non so davvero come ringraziarti!!! :D
 

Discussioni simili