2012-04-09 4 views
1

Ich habe eine Tabelle category, die Kategorie-Nummern zu Kategorienamen verknüpft. z. B. 1-Frucht, 2-Gemüse, 3-Insekten, 4-Städte usw. ...MySQL Joins - Kombinieren Kategorietabelle mit Datentabelle

Ich habe eine andere Tabelle item, die Elemente enthält, die zu genau einer Kategorie gehören. Jeder Artikel hat eine eindeutige ID, den Namen und seine Kategorie. z.B. 314-Kürbis- (Kategorie) 1

Kurz:

category 
------- 
c_id (int) 
c_name (varchar) 

item 
------- 
i_id (int) 
i_name (varchar) 
i_cat (int) 

Das Problem ist, dass nicht alle Kategorien Einzelteile haben. Ich habe die folgende verwendet, um Elemente nach Kategorie geordnet zu erhalten:

$STH = $DBH->prepare("SELECT * FROM item ORDER BY i_cat"); 

Diese in eine Tabelle erstellt wird, Überschriften, wie die Katze (rie) Änderungen zu extrahieren. Kategorien ohne Artikel werden natürlich nicht abgeholt.

Was ich will, ist eine Tabelle, die alle Kategorien (auch solche ohne tatsächliche Elemente) enthält und die die richtigen Elemente unter jeder Kategorie auflistet.

Ich kann eine umständliche Methode zu tun, was ich will, aber es muss eine saubere Lösung geben. Wie kann ich die Daten von beiden Tabellen in einem Aufruf verbinden, so dass jede Kategorie und jedes Element vorhanden ist? Ich nehme an, es beinhaltet die Verwendung von inner join, aber ich kann nicht sehen, wie man es effizient macht.

Danke.

+0

Danke, meine Herren :) – Nick

Antwort

2

versuchen Sie die folgende Abfrage, wird es alle Kategorien aus der category Tabelle und die entsprechenden Elemente aus der item Tabelle erhalten:

SELECT * 
FROM category c 
LEFT JOIN item i 
ON c.c_id = i.i_cat 
ORDER BY i_cat 
2

Eigentlich ist es kein inner join, was Sie suchen. Ein inner join würde alle übereinstimmenden Werte nehmen und die nicht übereinstimmenden entfernen. A left join nimmt Werte aus der Tabelle auf der linken Seite und versucht, sie mit den Werten in der rechten Tabelle zu verbinden. Wenn für eine Zeile aus der linken Tabelle kein passendes Element auf der rechten Seite vorhanden ist, werden diese Werte mit NULL gefüllt.

Geben Sie diese Abfrage einen Versuch:

select * from category 
left join item on c_id = i_id 
order by i_cat