problema outer join

  • Creatore Discussione Creatore Discussione LaKanka
  • Data di inizio Data di inizio

LaKanka

Utente Attivo
29 Ago 2008
166
0
0
Ciao a tutti... pensavo di conoscere il linguaggio MySql... ma mi sbagliavo... magari mi sto perdendo in un bicchiere d'acqua... ma al momento non riesco a trovare una soluzione!!!

Ho 2 tabelle
- registrati
id, nome, etc...
-annunci
id, id_registrato, pubblicato, etc..

Questi sono i campi di mio interesse...

Il problema è che devo estrarre SOLO i registrati che non hanno annunci oppure che li hanno ma con valore del campo pubblicato diverso da 1.

Ho provato con questa query:
PHP:
$query_ricerca= "SELECT * FROM annunci RIGHT OUTER JOIN registrati ON registrati.id=annunci.id_registrato WHERE annunci.pubblicato=1 GROUP BY annunci.id_registrato "

ma non ottengo l'estrazione sperata... mi estrae anche i reistrati che hanno pubblicati degli annunci...

Qualcuno mi può illuminare?
Ne ho provate anche altre ma non riesco a trovare la formula giusta.
 
Ciao a tutti... pensavo di conoscere il linguaggio MySql... ma mi sbagliavo... magari mi sto perdendo in un bicchiere d'acqua... ma al momento non riesco a trovare una soluzione!!!

Ho 2 tabelle
- registrati
id, nome, etc...
-annunci
id, id_registrato, pubblicato, etc..

Questi sono i campi di mio interesse...

Il problema è che devo estrarre SOLO i registrati che non hanno annunci oppure che li hanno ma con valore del campo pubblicato diverso da 1.

Ho provato con questa query:
PHP:
$query_ricerca= "SELECT * FROM annunci RIGHT OUTER JOIN registrati ON registrati.id=annunci.id_registrato WHERE annunci.pubblicato=1 GROUP BY annunci.id_registrato "

ma non ottengo l'estrazione sperata... mi estrae anche i reistrati che hanno pubblicati degli annunci...

Qualcuno mi può illuminare?
Ne ho provate anche altre ma non riesco a trovare la formula giusta.

Secondo me serve una query tipo qst:


SELECT id_registrato FROM registrati R

WHERE

--hanno annunci con valore <> 1
R.id_registrato IN SELECT id_registrato FROM ANNUNCI A1 WHERE (A1.pubblicato <> 1)


OR

--non hanno annunci
R.id_registrato NOT IN SELECT id_registrato FROM ANNUNCI A2
 
Sfortunatamente la query di Alessandro non cambia la situazione, continua a estrarmi anche i registrati che hanno annunci con pubblicato=1...

SELECT id_registrato FROM registrati R

WHERE

--hanno annunci con valore <> 1
R.id_registrato IN SELECT id_registrato FROM ANNUNCI A1 WHERE (A1.pubblicato <> 1)


OR

--non hanno annunci
R.id_registrato NOT IN SELECT id_registrato FROM ANNUNCI A2

Ho provato a tradurla così, ma mi da un errore di sintassi..
PHP:
$query_ricerca= "SELECT id_registrato FROM registrati R WHERE
(R.id_registrato IN SELECT id_registrato FROM ANNUNCI A1 WHERE (A1.pubblicato <> 1))OR(R.id_registrato NOT IN SELECT id_registrato FROM ANNUNCI A2) ";

forse ho sbagliato ad interpretarla...
 
Forse ci sono...
PHP:
$query_ricerca= "SELECT id FROM registrati R WHERE 
(R.id IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato <> 1))
||
(R.id NOT IN (SELECT id_registrato FROM annunci A2)) ";

Però continua ad estrarmi qualche registrato (meno di prima comunque) che ha annunci con campo pubblicato=1...
 
Ci sono!!

SELECT *,id FROM registrati R WHERE
(R.id NOT IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato = 1))
||
(R.id NOT IN (SELECT id_registrato FROM annunci A2))

Sembra funzionare!! bastava cambiare la formula:
R.id IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato <> 1)
con
R.id NOT IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato = 1)

Che fagiana!!
Grazie ragazzi, siete stati come sempre illuminanti!!!
 
SELECT *,id FROM registrati R WHERE
R.id IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato <> 1)

con

R.id NOT IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato = 1)


Salve,
non sono molto pratico di PHP e mySQL, ma a mio parere un problema nella traduzione poteva essere nel fatto che l'operatore di diseguaglianza è "!=" e non "<>".

In generale sostituire la IN con una NOT IN negando il predicato non dovrebbe dar luogo a risultati equivalenti:

la versione originale della query ha il significato di:
- seleziona i registrati che hanno almeno un annuncio col campo pubblicato diverso da 1

la versione modificata:
- seleziona i registrati che non hanno alcun annuncio con pubblicato=1

Come esempio puoi prendere un registrato che ha due articoli: uno con pubblicato=1 ed un altro con pubblicato=0 ed applicare le due query..

:)
 
In SQL l'operatore di negazione, che io sappia, è <>, non !=, come in PHP.

Si, credo anche io (e scusate per la minchiata scritta di fretta).

A sto punto non riesco a capire perchè:

Questo non lo prende:
R.id IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato <> 1)

.. e questo lo prende:
R.id NOT IN (SELECT id_registrato FROM annunci A1 WHERE A1.pubblicato = 1)
 

Discussioni simili