2016-03-25 9 views
0

Ich habe eine Aussage wie so:MySQL eine Summe Nummer erstellen, wenn Zeile in der Tabelle existiert

select * from category a 
inner join category b on a.row=b.relatedRow 
inner join category c on b.row=c.relatedRow where a.row=? 

Ich möchte die Anzahl der „Ebenen“ erhalten, wie so

Wenn eine Zeilen hat , level = 1, Wenn b hat Reihen, level = 2, Wenn c hat Reihen, level = 3

Wie kann ich das tun? Vielen Dank.

Beispiel

row, relatedRow 

1,null 

2,1 

3,2 

4,3 

5,2 

6,5 

So wird 1 nicht auf eine Zeile bezogen ist 2 zu 1 bezogen, 3 auf 2 und so weiter ...

Wenn row = 1, verwandte 1-Ebene existiert seit 1

Ebene existiert 2 besteht seit 2 bis 1

Pegel bezogen ist, da gibt es 3 3 und 5 wird im Zusammenhang mit 2

Stufe 4 besteht seit 6-5 zusammenhängt und 4 auf 3

Deshalb ist dieser Baum 4 Ebenen untergeht verwandt.

+0

Ich bin nicht sicher, was Sie mit "hat Zeilen" meinen. Willst du sagen, dass wenn relatedRow in der Joined-Tabelle vorhanden ist, du eine Spalte 'level = 1,2,3' hinzufügen willst? Können Sie Ihren Post bearbeiten, um Beispielzeilen von 'a, b, c' und der erwarteten Abfrageausgabe für die gegebenen Beispieleingabezeilen anzuzeigen? –

+0

Und was ist der Vorrang? Wenn b und c beide Zeilen haben, ist der Level dann 2 (b) oder 3 (c)? –

+0

Mein Tisch ist wie ein Baum. Es gibt verwandte Reihen von Reihen und diese können auch verwandte Reihen haben. Ich würde gerne die Anzahl der Ebenen finden, in denen der Baum untergeht. Ich weiß, dass es eine Grenze von 3 Stufen hat. Ich brauche eine Zahl, die generiert wird und mir die Anzahl der Ebenen angibt, die dieser Baum je nach Parameter hat. Wenn A Zeilen hat, Ebene 1, wenn B Zeilen hat, Ebene 2, wenn C Zeilen hat, Ebene 3 ... Und ich möchte diese Nummer 1-3 verwenden können. –

Antwort

1

versuchen, mit etwas entlang der Linien:

select 
    sum(case when not b.relatedRow is null then 1 else 0 end) as level1_total 
    sum(case when not c.relatedRow is null then 1 else 0 end) as level2_total 
from category a 
left join category b on a.row=b.relatedRow 
left join category c on b.row=c.relatedRow where a.row=? 

natürlich Sie die Bedingungen in der case ändern können, um Ihre Definition von hat Reihen

1
select 
    max(
     case 
      when c.relatedRow is not null then 3 
      when b.relatedRow is not null then 2 
      else 1 
     end 
    ) as "levels" 
from 
    A a 
    left outer join B b on b.relatedRow = a.row 
    left outer join C on c.relatedRow = b.row 

Jetzt sehen die Bearbeitung anpassen Die Frage, ich hoffe, Sie sehen, dass dieses Muster auf eine 4. Ebene und darüber hinaus erweitert werden kann. Wenn Sie eine where-Klausel hinzufügen, um eine Filterung durchzuführen, stellen Sie sicher, dass Sie nur Bedingungen für A hinzufügen, oder Sie werden die äußeren Verknüpfungen durcheinander bringen.

Verwandte Themen