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";
 

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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
 

Mary Azzurro

Nuovo Utente
7 Feb 2013
14
0
0
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:

criric

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
21 Ago 2010
5.607
54
48
TN
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 . ")";
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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:

Mary Azzurro

Nuovo Utente
7 Feb 2013
14
0
0
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:
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

Mary Azzurro

Nuovo Utente
7 Feb 2013
14
0
0
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! :)
 

borgo italia

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
4 Feb 2008
16.046
150
63
PR
www.borgo-italia.it
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
 

Mary Azzurro

Nuovo Utente
7 Feb 2013
14
0
0
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
Autore Titolo Forum Risposte Data
P Escludere stringhe contenute nei record da una select MySQL 3
M Escludere dei parametri da una SELECT MySQL 7
danjde [MySQL] Escludere specifico valore dalla query select MySQL 3
M [PHP] Escludere campi non valorizzati PHP 22
D Come posso escludere una pagina dalle regole di htaccess? Web Server 0
S [PHP] Selezionare ultimo campo ed escludere doppioni PHP 16
M [PHP] Escludere i record con pratica conclusa PHP 26
M Escludere dati da una query PHP 15
M Datetimepicker - escludere orari + step di 30 minuti jQuery 0
T Funzione per redirect versione mobile: escludere i tablet Javascript 1
novello88 escludere un post dal flusso RSS WordPress 0
Shyson Escludere un css codice dalla home PHP 17
L Ripetere Campi disabilitando input in riferimento ad un valore della select jQuery 0
otto9due Ordinare option di una select Javascript 5
W MySQL ciclo in SELECT MySQL 0
W MySQL SELECT list dinamica MySQL 0
M Select Option dentro una Table jQuery 2
G Colorare menu select attraverso ricerca php PHP 0
L problema con query select PHP 2
F menù select dinamico da db in php PHP 3
D popolare campi tra th alla select PHP 36
M Estrarre valore con SELECT COUNT PHP 0
M Creare un campo input select quantità di un numero intero prelevato dal db PHP 3
L Select Dinamiche...da txt? PHP 3
E Php select option e ajax PHP 23
R Select concatenata che non funziona la seconda volta Ajax 3
L select join e sottrazione punti PHP 13
L input dati con inser into select ? PHP 4
V hierarchy-select jQuery 0
Emix Select concatenate php sql ajax PHP 2
F query e form con select multipla PHP 17
T recupero valori select multipla da android Javascript 3
J php, scegliere autista da select e mostrare se ha fatto un incidente PHP 8
Tommy03 Select in ordine per numero di record MySQL 7
T problema con select dinamica con jquery Javascript 0
J Far comparire e scomparire un div con un select Javascript 1
M Opzioni select da 1 a 200 PHP 0
I Fatal error: Query Failed! SQL: SELECT * INTO OUTFILE PHP 1
C input in sostituzione della select PHP 2
G Insert into select - Aiuto MySQL 0
max1974 autocomplete trigger select jQuery 0
X [Select] Valori chiave non presenti in un'altra tabella MySQL 2
M Estrarre dati da una select HTML PHP 3
MarcoGrazia jquery validate, necessità di validare almeno un elemento select su due jQuery 1
T [PHP] Autocompilazione input multiple da una select PHP 1
Alex_70 [PHP] Visualizzare foto tramite select PHP 0
S [PHP] aggiornamento table tramite select senza ricaricare la pagina PHP 5
psicomia Gestione funzione in javascript in tabella richiamare"textarea" valori preimpostati in "select" Javascript 2
M [PHP] Problema con query select PHP 2
C [PHP] Controllo <select> comportamento anomalo PHP 2

Discussioni simili