Frage

Ich habe ein MySQL LEFT JOIN Problem.

Ich habe drei Tabellen, die ich zu verbinden bin versucht.

Eine Person Tabelle:

CREATE TABLE person (
    id INT NOT NULL AUTO_INCREMENT,
    type ENUM('student', 'staff', 'guardian') NOT NULL,
    first_name CHAR(30) NOT NULL,
    last_name CHAR(30) NOT NULL,
    gender ENUM('m', 'f') NOT NULL,
    dob VARCHAR(30) NOT NULL,
    PRIMARY KEY (id)
);

Ein Student Tabelle:

CREATE TABLE student (
    id INT NOT NULL AUTO_INCREMENT,
    person_id INT NOT NULL,
    primary_guardian INT NOT NULL,
    secondary_guardian INT,
    join_date VARCHAR(30) NOT NULL,  
    status ENUM('current', 'graduated', 'expelled', 'other') NOT NULL,
    tutor_group VARCHAR(30) NOT NULL,
    year_group VARCHAR(30) NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (person_id) REFERENCES person(id) ON DELETE CASCADE,
    FOREIGN KEY (primary_guardian) REFERENCES guardian(id),
    FOREIGN KEY (secondary_guardian) REFERENCES guardian(id),
    FOREIGN KEY (tutor_group) REFERENCES tutor_group(name),
    FOREIGN KEY (year_group) REFERENCES year_group(name)
);

Und ein Vorfall Tabelle:

CREATE TABLE incident (
    id INT NOT NULL AUTO_INCREMENT,
    student INT NOT NULL,
    staff INT NOT NULL,
    guardian INT NOT NULL,
    sent_home BOOLEAN NOT NULL,
    illness_type VARCHAR(255) NOT NULL,
    action_taken VARCHAR(255) NOT NULL,
    incident_date DATETIME NOT NULL,
    PRIMARY KEY (id),
    FOREIGN KEY (student) REFERENCES student(id),
    FOREIGN KEY (staff) REFERENCES staff(id),
    FOREIGN KEY (guardian) REFERENCES guardian(id)
);

Was ich versuche wählen Sie den Vornamen, den Nachnamen und die Anzahl der Vorfälle für jeden Schüler im ersten Jahr 9.

Hier ist mein bester Versuch bei der Abfrage:

SELECT p.first_name, p.last_name, COUNT(i.student)
FROM person p, student s  LEFT JOIN incident i ON s.id = i.student 
WHERE p.id = s.person_id AND s.year_group LIKE "%Year 9%";

Allerdings ignoriert er alle Studenten ohne ein Ereignis, das nicht das, was ich will, ist - sie angezeigt werden sollte, aber mit einer Zählung von 0. Wenn ich die linke entfernen verbinden und die Zählung dann alles, was ich bekommen die Schüler, wie ich erwarten würde.

Ich habe wahrscheinlich links mißverstanden join aber ich dachte, es tun soll, im Wesentlichen, was ich versuche zu tun?

Danke für Ihre Hilfe,

Adam

War es hilfreich?

Lösung

Was Sie tun, ist in Ordnung, man muss nur die Gruppe durch Klausel verpassten aus

SELECT p.first_name, p.last_name, COUNT(i.student)
FROM person p, student s  LEFT JOIN incident i ON s.id = i.student 
WHERE p.id = s.person_id AND s.year_group LIKE "%Year 9%"
GROUP BY p.first_name, p.last_name;

Hier einige Testdaten

insert into person values(1, 'student', 'Alice', 'Foo', 'f','1970-01-01');
insert into person values(2, 'student', 'Bob', 'Bar', 'm','1970-01-01');

insert into student values(1,1,0,0,'', 'current','','Year 9');
insert into student values(2,2,0,0,'', 'current','','Year 9');

insert into incident values(1,1,0,0,0,'flu','chicken soup', '2008-01-08');

Und hier ist die Ausgabe der Abfrage mit der Gruppe von ihm hinzugefügt:

+------------+-----------+------------------+
| first_name | last_name | COUNT(i.student) |
+------------+-----------+------------------+
| Alice      | Foo       |                1 |
| Bob        | Bar       |                0 |
+------------+-----------+------------------+

Sie konnten weiter die Abfrage bereinigen von Klauseln aus Ihrer where-Klausel beitreten zu machen, und die Gruppierung auf der Person-ID:

SELECT p.first_name, p.last_name, COUNT(i.student)
FROM person p
INNER JOIN student s ON(p.id = s.person_id)
LEFT JOIN incident i ON(s.id = i.student)
WHERE s.year_group LIKE "%Year 9%"
GROUP BY p.id;

Andere Tipps

Alternativ können Sie die LEFT JOIN vermeiden, indem Sie einen korrelierte Unterabfrage

SELECT
  p.first_name
  , p.last_name
  , (SELECT COUNT(*) FROM incident i WHERE i.student = s.id) 
FROM
  person p JOIN student s on s.person_id = p.id
WHERE
  s.year_group LIKE "%Year 9%"

Sie verwenden Zählung ohne Gruppe für einen Start, und du bist Mischen „wo“ und „auf“ Syntax für Joins. Versuchen Sie folgendes:

SELECT p.first_name, p.last_name, COUNT(i.student)
FROM person p
JOIN student s on p.id = s.person
LEFT JOIN incident i ON s.id = i.student 
WHERE s.year_group LIKE "%Year 9%"
GROUP BY P.id;

Wäre das nicht eine linke Außen sein verbinden Sie suchen? Ich kann meine Terminologie verwechselt haben? Wäre nicht das erste Mal sein. Aber Aron Antwort funktionieren würde.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top