2016-06-30 12 views
-1

Ich habe linken Join verwendet und habe festgestellt, dass es sehr nützlich ist. Heute bin ich auf ein Problem gestoßen, bei dem die rechte Seite NULL nicht angezeigt wird. Erste Tabelle ist Kategorie, die als unten:Mysql linkjoin Problem mit Null

id name 
1  ROR 
2 Mutation 
3 Partition 

zweite Tabelle ist scheme_category, die als unten:

id scheme_id category_id period 
1  12    1   3/2016 
2  12    2   3/2016 
3  12    1   4/2016 
4  12    2   4/2016 
5  12    3   4/2016 
6  12    1   5/2016 
7  12    3   5/2016 

Für die Periode 3/2016, existiert kein Wert für category_id 3. Ähnlich Für den Zeitraum 5/2016 existiert für category_id 2 kein Wert. Ich habe eine Abfrage mit der Tabelle category und schedule_category geschrieben, so dass nicht vorhandene Kategorien in der Tabelle scheme_category als NULL angezeigt werden:

select category.name, period 
from category 
    left join scheme_category on category.id= scheme_category.category_id 

Diese Abfrage zeigt jedoch keine Felder als NULL an. Bitte führen Sie in dieser Hinsicht.

+1

Das ist korrekt, weil es in Ihrer Tabelle schedule_kategorie alle eindeutigen Kategoriewerte enthält, versuchen Sie, einen neuen Wert in die Kategorie einzufügen, dann erhalten Sie null Datensatz –

+1

Diese Abfrage zeigte offensichtlich keine Felder als 'NULL' für Ihre Beispieldaten. – Blank

+0

Bitte versuchen Sie diese Abfrage für Ihre Lösung: 'select category.name, Periode, category_id aus der Kategorie scheme_category beitreten links auf category.id = scheme_category.category_id' –

Antwort

1

Das Problem ist, dass Sie nur an der Kategorie ID teilnehmen und die Kategorie IDs übereinstimmen. Sie müssen eine vollständige Liste der Kategorie-ID-Periodenpaare haben und der Tabelle "scheme_category" auf dieser Liste beitreten.

Entweder Sie erstellen eine separate Periodentabelle, in der Sie die Zeiträume auflisten, oder Sie erhalten die Liste der Zeiträume aus der schema_category-Tabelle selbst. Erstellen Sie anschließend einen kartesischen Join zwischen der Liste der Punkte und der Kategorie ids, und verknüpfen Sie diesen Datensatz in der Tabelle schedule_kategorie.

Da die zweite Option desto komplizierter ist, werde ich einen Beispielcode für das zur Verfügung stellen:

select 
from 
    (select distinct period from scheme_category) t1 
join 
    category --note that there is no join condition -> creating a Cartesian join 
left join 
    scheme_category on t1.period=scheme_category.period and category.id=scheme_category.category_id  
+0

Danke Schatten für Ihre Hilfe. Ich werde deine Antwort akzeptieren. – John

-1

ich in PhpMyAdmin zwei Tabellen ähnlich wie bei Ihnen erstellt. Meine Abfrage sieht wie folgt aus:

SELECT category.name, scheme_category.peroid 
FROM `scheme_category` 
LEFT JOIN category 
ON category.id = scheme_category.category_id 

... und es gibt mir:

name | peroid 
ROR | 3/2016 
Mutation | 3/2016 
ROR |4/2016 

funktioniert so gut.

+0

Die Frage war, warum das OP nicht die erwarteten 'NULL's sieht, nicht ob die Abfrage funktioniert. –