Domanda

Sto ottenendo risultati strani da una query MySQL SELECT che coinvolge un LEFT JOIN e non riesco a capire se la mia comprensione di LEFT JOIN è sbagliato o se vedo un comportamento davvero strano.

Ho due tabelle con una relazione molti-a-uno: per ogni record nella tabella 1 ci sono 0 o più record nella tabella 2 . Voglio selezionare tutti i record nella tabella 1 con una colonna che conta il numero di record correlati nella tabella 2. A quanto ho capito, LEFT JOIN dovrebbe sempre restituire tutti i record in LEFT lato dell'istruzione.

Ecco un database di prova che presenta il problema:

CREATE DATABASE Test;
USE Test;

CREATE TABLE Dates (
   dateID INT UNSIGNED NOT NULL AUTO_INCREMENT,
   date DATE NOT NULL,
   UNIQUE KEY (dateID)
) TYPE=MyISAM;


CREATE TABLE Slots (
   slotID INT UNSIGNED NOT NULL AUTO_INCREMENT,
   dateID INT UNSIGNED NOT NULL,
   UNIQUE KEY (slotID)
) TYPE=MyISAM;

INSERT INTO Dates (date) VALUES ('2008-10-12'),('2008-10-13'),('2008-10-14');
INSERT INTO Slots (dateID) VALUES (3);

La tabella Date ha tre record, e le Slot 1 - e quel record punta al terzo record in Date.

Se eseguo la seguente query ..

SELECT d.date, count(s.slotID) FROM Dates AS d LEFT JOIN Slots AS s ON s.dateID=d.dateID GROUP BY s.dateID;

.. Mi aspetto di vedere una tabella con 3 righe in - due con un conteggio di 0 e una con un conteggio di 1. Ma quello che vedo effettivamente è questo:

+------------+-----------------+
| date       | count(s.slotID) |
+------------+-----------------+
| 2008-10-12 |               0 |
| 2008-10-14 |               1 |
+------------+-----------------+

Viene visualizzato il primo record con un conteggio zero, ma il record successivo con un conteggio zero viene ignorato.

Sto facendo qualcosa di sbagliato o non capisco cosa dovrebbe fare LEFT JOIN?

È stato utile?

Soluzione

È necessario GROUP BY d.dateID . In due dei tuoi casi, s.DateID è NULL ( LEFT JOIN ) e questi sono combinati insieme.

Penso che troverai anche che questo non è valido (ANSI) SQL, perché d.date non fa parte di un GROUP BY o il risultato di un'operazione aggregata e non dovrebbe essere in grado di essere SELECT ed.

Altri suggerimenti

Penso che intendi raggruppare per d.dateId.

Prova a rimuovere GROUP BY s.dateID

La data per 10-12 e 10-13 è raggruppata da te. Poiché sono 2 valori nulli, il conteggio viene valutato su 0

Non so se questo è valido in MySQL ma probabilmente potresti annullare questo errore in futuro usando invece la sintassi seguente

SELECT date, count(slotID) as slotCount
FROM Dates LEFT OUTER JOIN Slots USING (dateID)
GROUP BY (date)

Usando la clausola USING non si ottengono due dateID di cui tenere traccia.

sostituisci GROUP BY s.dateID con d.dateID.

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