Domanda

Ho un problema a formulare una query MySQL per svolgere la seguente attività, anche se ho visto domande simili discusse qui, sono sufficientemente diverse da questa per snooker i miei tentativi di trasporli. Il problema è (abbastanza) semplice da dichiarare. Ho tre tabelle, "membri", "dog_shareoffered" e "dog_sharewanted". I membri possono avere zero, una o più pubblicità per le cose che vogliono vendere o desiderano acquistare e i dettagli sono archiviati nella tabella corrispondente offerta o desiderata, insieme all'ID del membro che ha inserito l'annuncio. La colonna 'id' è univoca per il membro e comune a tutte e tre le tabelle. La domanda che voglio è chiedere quanti membri non hanno inserito un annuncio in nessuna delle due tabelle.

Ho provato diversi modi per chiederlo. Il più vicino che posso ottenere è una domanda che non si schianta! (Non sono un esperto MySQL in alcun modo). Quanto segue ho messo insieme da ciò che ho raccolto da altri esempi, ma restituisce zero righe, dove so che il risultato dovrebbe essere maggiore di zero.

SELECT id 
  FROM members 
 WHERE id IN (SELECT id 
                FROM dog_sharewanted 
               WHERE id IS NULL) 
   AND id IN (SELECT id 
                FROM dog_shareoffered 
               WHERE id IS NULL)

Questa query sembra piacevolmente da capire, a differenza del "join di" che ho visto, ma immagino che forse ho bisogno di una sorta di join, ma come sembrerebbe questo aspetto?

È stato utile?

Soluzione

Se non vuoi annunci o tavolo, quindi il tipo di domanda che stai cercando è:

SELECT id
FROM members
WHERE id NOT IN ( any id from any other table )

Per selezionare ID da altre tabelle:

SELECT id
FROM <othertable>

Quindi:

SELECT id
FROM members
WHERE id NOT IN (SELECT id FROM dog_shareoffered)
 AND  id NOT IN (SELECT id FROM dog_sharewanted)

Ho aggiunto il "seleziona distinto" perché un membro può inserire molti annunci, ma c'è solo un ID. Avevo un tempo SELECT DISTINCT Nelle sottoquerie sopra, ma come menzionano i commenti di seguito, questo non è necessario.

Se si desidera evitare un sottocarma (un possibile aumento delle prestazioni, a seconda ..) potresti usare alcuni join a sinistra:

SELECT members.id
FROM members
LEFT JOIN dog_shareoffered
 ON dog_shareoffered.id = members.id
LEFT JOIN dog_sharewanted
 ON dog_sharewanted.id = members.id
WHERE dog_shareoffered.id IS NULL
  AND dog_sharewanted.id IS NULL

Perché questo funziona:

Prende il tavolo members e si unisce agli altri due tavoli sul id colonna. Il LEFT JOIN significa che se un membro esiste nel members tavolo ma non il tavolo a cui ci stiamo unendo (ad es. dog_shareoffered), quindi il corrispondente dog_shareoffered le colonne avranno NULL in loro.

Così la WHERE le condizioni scelgono file dove c'è un NULL id in entrambi dog_shareoffered e dog_sharewanted, nel senso che abbiamo trovato ID in members senza ID corrispondente nelle altre due tabelle.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top