2016-06-19 12 views
0

Ich habe mehrere Tabellen für eine Bibliotheksdatenbank und ich möchte zählen, wie viele Publikationen an eine bestimmte Gruppe ausgeliehen wurde.
Ich habe diese Tabellen
Patrons TischMysql Count bezogene Datensätze nicht mitgerechnet

CREATE TABLE `patrons` (
    `id` int(10) UNSIGNED NOT NULL, 
    `category_id` int(10) UNSIGNED NOT NULL, 
    `firstname` varchar(255) NOT NULL, 
    `lastname` varchar(255) NOT NULL, 
    `email` varchar(255) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


Patron Kategorien

CREATE TABLE `patron_categories` (
    `id` int(10) UNSIGNED NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `overdue` float NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


Publikationen

CREATE TABLE `publication` (
    `id` int(10) UNSIGNED NOT NULL, 
    `name` varchar(255) NOT NULL, 
    `year` year(4) NOT NULL, 
    `ISBN` varchar(255) NOT NULL, 
    `type` varchar(24) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


Kasse

CREATE TABLE `checkouts` (
    `id` int(10) UNSIGNED NOT NULL, 
    `publication_id` int(10) UNSIGNED NOT NULL, 
    `patron_id` int(10) UNSIGNED NOT NULL, 
    `checkout` date NOT NULL, 
    `checkin` date NOT NULL, 
    `actual_checkin` date DEFAULT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 


Dies ist meine Abfrage Mäzen Kategorien mit ihrer gesamten Gönner und ihre aktuelle Anzahl der Publikationen ihrer Kasse aus aufzulisten.

SELECT pc.NAME     AS Category, 
     Count(p.id)    AS patrons, 
     Count(c.id)   AS publications 
FROM patron_categories AS pc 
     JOIN patrons AS p 
     ON pc.id = p.category_id 
     LEFT JOIN checkouts AS c 
       ON c.actual_checkin = NULL 
     LEFT JOIN publication AS pub 
       ON c.publication_id = pub.id 
GROUP BY Category 
ORDER BY Category 

Ich weiß nicht, was falsch ist, aber es gibt die Anzahl der Publikationen als 0, während es an diesen Förderern viele Publikationen verliehen sind. Irgendwelche Hilfe bitte. Die vollständige Datenbank mit Dummy-Daten befindet sich here.

+0

Versuchen Sie, die 'Gruppe by' entfernen und' count' Spalten, und führe aus, was mit 'select *' übrig ist - siehst du, was du erwartest? Sobald Sie diese Abfrage richtig gemacht haben, fügen Sie einfach die Anzahl und die Gruppe nach zurück. – Blorgbeard

Antwort

0

versuchen Sie dies:

SELECT pc.NAME     AS Category, 
     COUNT(p.id)    AS patrons, 
     COUNT(c.id)   AS publications 

FROM patron_categories AS pc 
     JOIN patrons AS p 
     ON pc.id = p.category_id 
     LEFT JOIN checkouts AS c 
       ON c.patron_id = p.id 
     LEFT JOIN publication AS pub 
       ON c.publication_id = pub.id 
GROUP BY Category 
ORDER BY Category 

Das Ergebnis:

enter image description here

+0

Es funktioniert, Alter. Vielen Dank. –

0

Ihre Abfrage sieht gut aus, außer zu überprüfen, ob das Feld c.actual_checkin null ist. Versuchen Sie, die Join-Anweisung ON c.actual_checkin = NULL-ON c.actual_checkin IS NULL