2016-05-29 31 views
1

Zunächst entschuldigt, wenn der Titel nicht mit der Frage übereinstimmt. Nun, das Problem ist, wie man diese Abfrage erstellt ...Mysql Abfrage innerhalb einer Abfrage

Ich habe eine Tabelle namens category Es enthält Kategorien meiner Sachen (Filme). Es ist so ...

-------------------------------- 
ID | name | parent_category 
-------------------------------- 
1 | love | 0 
2 | action | 0 
3 | fear | 0 
4 | passion| 1 
5 | danger | 2 
6 | death | 3 
-------------------------------- 

Also, wie Sie sehen, hat jede Kategorie eine Elternkategorie. Außer den ersten 3. Sie sind Eltern.

und Filme Tisch ist so ...

-------------------------------- 
ID | name | category 
-------------------------------- 
1 | aaaa | 1 
2 | bbbbbb | 2 
3 | cccc | 2 
4 | ddddddd| 1 
5 | eeeeee | 3 
6 | fffff | 3 
-------------------------------- 

Also, was ich will, ist zu tun, wählen Sie Filme durch übergeordnete Kategorie. Das heißt, wenn ich auf Kategorie love klicke, sollte es alle Filme von Kategorien auswählen, die love als übergeordnete Kategorie haben.

Also, wie schreibe ich das in einer einzigen Abfrage?

+1

'select * from Filme, in denen Kategorie = 1 '.. es wird –

+1

alle Filme in der Liebe Kategorie anzeigen Wie viele Hierarchieebenen kann es sein? – sagi

+0

Nein, in der Filmtabelle werden Filme immer mit einer Kinderkategorie gespeichert. – TharinduLucky

Antwort

1

Wenn die Eltern nur eine Ebene tief sind, dann können Sie join s verwenden:

select m.*, 
     coalesce(cp.id, c.id) as parent_id, 
     coalesce(cp.name, c.name) as parent_name 
from movies m left join 
    categories c 
    on m.category = c.id left join 
    categories cp 
    on c.parent_category = cp.id; 

Eigentlich, wenn Sie nur die id wollen, brauchen Sie nicht zwei verbindet:

select m.*, 
     (case when c.parent_id > 0 then c.parent_id else c.id end) as parent_id 
from movies m left join 
    categories c 
    on m.category = c.id ; 

Oder, einfacher gesagt:

select m.*, greatest(c.parent_id, c.id) as parent_id 
. . . 
+0

Danke! Das scheint etwas fortgeschrittenes Zeug zu sein. Jedenfalls werde ich es versuchen. :) – TharinduLucky

+0

In der Antwort, was bedeutet m? – TharinduLucky

+1

'm' ist ein Tabellenalias. Es ist eine Abkürzung für eine Tabelle oder Unterabfrage in der 'from'-Klausel. In einigen Fällen ist es eine Annehmlichkeit zum Schreiben und Lesen von Abfragen; in anderen Fällen (für 'linke Joins') ist es eine Voraussetzung. –

1

Reihen von Bedingung auf secend t gefiltert auszuwählen in der Lage, in FROM-Klausel oder Unterabfrage in Bedingung mit IN oder EXISTS Funktion beizutreten. Um das Feld mit einer Zeichenfolge zu vergleichen, können Sie den LIKE-Operator verwenden.

1

Wenn Sie auf parent_category basieren Filterung -

SELECT b.*, a.name FROM movies b 
    LEFT JOIN categories a ON a.id = b.category 
WHERE a.parent_category = 1; 
Verwandte Themen