2011-01-01 3 views
1

Ich habe die folgende MySQL-Struktur (viel minimiert):Fehlende SQL-Einträge bei der Kombination von LEFT/INNEN + GROUP JOIN BY

CREATE TABLE `site_movies` (
    `id` int(10), 
    `title` varchar(90), 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

INSERT INTO `site_movies` VALUES(1, 'Borrowers, The'); 
INSERT INTO `site_movies` VALUES(2, 'Louis C.K.: Chewed Up'); 
INSERT INTO `site_movies` VALUES(3, 'Louis C.K.: Shameless'); 
INSERT INTO `site_movies` VALUES(4, 'Vinni-Pukh'); 

CREATE TABLE `site_movies_directors` (
    `id` mediumint(8), 
    `name` varchar(255), 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM; 

CREATE TABLE `site_movies_directors_connections` (
    `movie_id` mediumint(8), 
    `director_id` mediumint(8) 
) ENGINE=MyISAM; 

CREATE TABLE `site_movies_seen` (
    `object_id` int(10), 
    `date` varchar(10), 
    `rating` tinyint(2) 
) ENGINE=MyISAM; 

INSERT INTO `site_movies_seen` VALUES(1, '0', 4); 
INSERT INTO `site_movies_seen` VALUES(2, '1293821757', 5); 
INSERT INTO `site_movies_seen` VALUES(3, '1293821758', 7); 
INSERT INTO `site_movies_seen` VALUES(4, '0', 6); 

Und dann die folgende Abfrage (auch viel minimiert):

SELECT m.title, s.date 
FROM site_movies_seen s 
INNER JOIN site_movies m ON s.object_id = m.id 
LEFT JOIN site_movies_directors_connections AS mdc ON (m.id = mdc.movie_id) 
GROUP BY mdc.movie_id, s.date 
ORDER BY s.date ASC 

Drucke:

title date 
Borrowers, The 0 
Louis C.K.: Chewed Up 1293821757 
Louis C.K.: Shameless 1293821758 

Beachten sie, dass "Vinni-Pukh" fehlt, weil es der zweite Eintrag in der _seen Tabelle mit Datum ist = 0. Wie kann ich alle Ganzzahlen einschließen, auch wenn mehrere Ganzzahlen den gleichen Zeitstempel haben?

Antwort

4

durch Anweisung, um diese Änderung Ihrer Gruppe:

GROUP BY m.id, s.date 

Ihre Joinbedingung m.id = mdc.movie_id sagt, so dass Sie vielleicht denken, dass diese beiden Felder immer gleich sind und daher spielt es keine Rolle, ob Sie m.id oder mdc.movie_id in schreiben Ihre GROUP BY. Dies ist nicht wahr, weil Sie einen LINKEN JOIN, nicht einen INNEREN JOIN verwenden. Das bedeutet, dass mdc.movie_id NULL sein kann und alle NULL-Einträge in dieselbe Gruppe gehen.

Auch, da Sie keine Spalten aus der site_movies_directors_connections auswählen, sollten Sie es aus der Abfrage vollständig weglassen.

SELECT m.title, s.date 
FROM site_movies_seen s 
INNER JOIN site_movies m ON s.object_id = m.id 
GROUP BY m.id, s.date 
ORDER BY s.date 
+0

Danke, Mark! Das Ändern von mdc.movie_id in m.id hat den Trick gemacht. Was die Director-Sachen angeht, ist das nur eine Folge von etwas zu minimiertem Code von mir ;-) – EspenA