Newsgroup: it.comp.www.php
Titolo: [MySql] Problema con operatore != o <> e Join

Ciao a tutti,
sono incappato oggi in questa cosa.. che forse per molti
sembrerà banale ma che non mi spiego:
( mysql  Ver 11.16 Distrib 3.23.49, for redhat-linux-gnu (i386) )
L' operatore != o <> non mi funziona cioè è come se non lo mettessi ...
se faccio il ragionamento al contrario, usando =  tutto funziona bene (
applica il "filtro")
Questa è la mia query:
SELECT a1 FROM a,b WHERE a.a1!=b.b1 group by a.a1;
o
SELECT * FROM a,b WHERE a.a1!=b.b1 group by a.a1;
Ecco il mio DB di test:
#
# Struttura della tabella `a`
#
CREATE TABLE a (
  a1 int(11) NOT NULL default '0',
  KEY a1 (a1)
) TYPE=MyISAM;
#
# Dump dei dati per la tabella `a`
#
INSERT INTO a VALUES (0);
INSERT INTO a VALUES (1);
INSERT INTO a VALUES (2);
INSERT INTO a VALUES (3);
INSERT INTO a VALUES (4);
INSERT INTO a VALUES (5);
INSERT INTO a VALUES (6);
INSERT INTO a VALUES (7);
INSERT INTO a VALUES (8);
INSERT INTO a VALUES (9);
# --------------------------------------------------------
#
# Struttura della tabella `b`
#
CREATE TABLE b (
  b1 int(11) unsigned NOT NULL default '0',
  KEY b1 (b1)
) TYPE=MyISAM;
#
# Dump dei dati per la tabella `b`
#
INSERT INTO b VALUES (3);
INSERT INTO b VALUES (5);
INSERT INTO b VALUES (6);
Qualche idea ?
Grazie mille
                                    -- Yena --

 SELECT * FROM a,b WHERE a.a1!=b.b1 group by a.a1;
puoi capire tutto eliminando il group by:
mysql> SELECT * FROM a,b WHERE a.a1!=b.b1;
+----+----+
| a1 | b1 |
+----+----+
|  0 |  3 |
|  1 |  3 |
|  2 |  3 |
|  4 |  3 | --saltato il 3
|  5 |  3 |
|  6 |  3 |
|  7 |  3 |
|  8 |  3 |
|  9 |  3 |
|  0 |  5 |
|  1 |  5 |
|  2 |  5 |
|  3 |  5 |
|  4 |  5 |
|  6 |  5 | -- saltato il 5
|  7 |  5 |
|  8 |  5 |
|  9 |  5 |
|  0 |  6 |
|  1 |  6 |
|  2 |  6 |
|  3 |  6 |
|  4 |  6 |
|  5 |  6 |
|  7 |  6 | -- saltato il 6
|  8 |  6 |
|  9 |  6 |
+----+----+
ovvero: la join "as is" è un prodotto cartesiano delle due tabelle. la 
tua condizione non serve a niente perché 3!=5 quindi il 3 viene 
visualizzato.
inoltre, la group by non ha senso perché non c'è nessuna funzione di 
raggruppamento (la cosa brutta è che mysql non da errore su questo ma 
restituisce il primo record che trova: cosa assolutamente sbagliata).
funzioni di raggruppamento sono max, sum, count ecc.
la query che serve a te è:
select a1 from a left join b on a1=b1 where b1 is null;
ovvero: fammi il prodotto cartesiano delle due tabelle e prendi solo i 
record con a1=b1 (clausola on):
+----+----+
| a1 | b1 |
+----+----+
|  3 |  3 |
|  5 |  5 |
|  6 |  6 |
+----+----+
  o dove a1 non ha corrispondenti (clausola left join):
+----+------+
| a1 | b1   |
+----+------+
|  0 | NULL |
|  1 | NULL |
|  2 | NULL |
|  4 | NULL |
|  7 | NULL |
|  8 | NULL |
|  9 | NULL |
+----+------+
il risultato (senza wheres) è:
+----+------+
| a1 | b1   |
+----+------+
|  0 | NULL |
|  1 | NULL |
|  2 | NULL |
|  3 |    3 |
|  4 | NULL |
|  5 |    5 |
|  6 |    6 |
|  7 | NULL |
|  8 | NULL |
|  9 | NULL |
+----+------+
a questo punto la where magica (where b1 is null) isola i record senza 
corrispondenza, per cui la query scritta sopra mi ritorna:
mysql> select a1 from a left join b on a1=b1 where b1 is null;
+----+
| a1 |
+----+
|  0 |
|  1 |
|  2 |
|  4 |
|  7 |
|  8 |
|  9 |
+----+
claro, no???
ciao
-- 
punkarruso

 ha scritto nel messaggio
news:Ia4xa.6617$lK4.1...@twister1.libero.it...

Grazie mille punk per il tuo tempo, sei come sempre + che esauriente nelle
tue spiegazioni.
Ora mi è tutto chiaro !
 
    -- Yena --