2016-04-06 7 views
1

Ich habe eine Tabelle teachings genannt:Auswahl aller mit verwandten Produkten

id, name, description

Und eine products Tabelle: id, name, description, teachingID

Ich möchte alle auswählen von Lehren, die Produkte mit ihnen verbunden haben. Wenn es eine Lehre gibt, die keine Produkte in der Produkttabelle hat, will ich es nicht.

Bisher kam ich mit:

SELECT * FROM `teachings` 
LEFT JOIN `products` ON `products`.`teachingID` = `teachings`.`id` 
WHERE COUNT(`products`) > 0 

Aber das funktioniert nicht :(jemand mich in die richtige Richtung zeigen kann

+0

Warum ein LEFT dann JOIN verwenden! ?!?!?!?!? !!? – Strawberry

+0

Ich bevorzuge INNER Join für diese –

+0

@Strawberry Ich benutze immer linken Join für alle meine Joins und es ist mich nie im Stich gelassen! : P – Chud37

Antwort

3

Wenn Sie nur wollen Lehren zurückzukehren, um mit mindestens einem? Produkt mit ihm assoziiert dann exists Unterabfrage verwendet werden. auf diese Weise müssen Sie nicht zählen Produkte pro Lehre.

Mein mysql bekam rostig, aber das tun sollte

select * 
from teachings t 
where exists 
(
    select 1 
    from products p 
    where p.teachingID = t.id 
) 
+0

Ich habe noch nie von WHERE EXISTS gehört, danke! – Chud37

+0

es funktioniert! Vielen Dank! – Chud37

+0

Dies ist der direkte Weg. Und Sie können sogar eine 'IN'-Klausel anstelle der' EXISTS'-Klausel verwenden, die die Abfrage noch einfacher und lesbarer machen würde. –

1

Hier ist eine zusätzliche Antwort, um einfach die IN-Klausel zu zeigen, von der ich in einem Kommentar gesprochen habe. Die Aufgabe ist sehr einfach: Holen Sie sich Belehrungssätze, für die ein Produktdatensatz vorhanden sind. Mit anderen Worten: Erhalten Sie Belehrungsaufzeichnungen, die in die Produkttabelle erwähnt werden. So benutzt man hier EXISTS oder IN.

Die Tabellen nur zu verschleiern, was getan wird, also tun Sie das nicht.

Die EXISTS Abfrage:

select * 
from teachings t 
where exists (select * from products p where p.teachingid = t.id); 

Die IN Abfrage, die noch lesbar ist, weil die Unterabfrage nicht auf die Hauptabfrage korreliert:

select * 
from teachings t 
where id in (select teachingid from products p); 
+0

Sie haben Recht, das ist lesbarer. Ich habe bereits eine Antwort als richtig markiert, aber danke, ich mag die zweite SQL, die Sie dort haben. – Chud37

Verwandte Themen