Anzahl der Zeilen mit einer übergeordneten ID, die der Zeile mit einer übergeordneten ID von 0 in einer Abfrage entspricht

9

Ich möchte mit MySQL in einer Abfrage Folgendes tun:

  • Nimm eine Zeile mit einer parent_id von 0
  • Ermitteln Sie eine Anzahl aller Zeilen mit einer parent_id der von uns erfassten Zeile mit einer parent_id von 0

Wie kann ich dies in einer Abfrage erreichen? Bitte lassen Sie mich wissen, wenn Sie weitere Informationen benötigen. Ich werde Ihnen gerne so behilflich sein, wie ich kann. Ich bin kein Experte für das Erstellen von Fragen. Bitte teilen Sie mir mit, welche weiteren Informationen Sie benötigen.

Hier ist ein Beispiel dafür, was ich jetzt mache:

select id from messages where parent_id=0

und dann

select count(id) from messages where parent_id={{previously_chosen_id}}

Wie bekomme ich eine One-Shot-Abfrage? Etwas wie...

select id, count(records where parent_id=the id we just asked for)

Oder gibt es einen besseren Weg, um damit umzugehen? Sie sehen, derzeit muss ich eine Menge Abfragen ausführen, um die Anzahl zu ermitteln, wenn ich es lieber auf einmal tun möchte.

jkushner
quelle

Antworten:

6

Dies ist mit einer Inline-Unterabfrage leicht zu erreichen:

select  m.id,
        (select count(*) from messages where parent_id= m.id ) as ChildCount
from messages m
where m.parent_id = 0

Beachten Sie, dass nein group byerforderlich ist, da eine Unterabfrage verwendet wird.

Druzin
quelle
3

Diese Abfrage gibt Ihnen die gewünschte Ausgabe:

SELECT
    parent.id
  , COUNT(child.id) AS child_count
FROM
             messages parent
  INNER JOIN messages child
    ON child.parent_id = parent.id
WHERE parent.parent_id = 0
GROUP BY parent.id;

Sie können diesen Code hier auf SQL Fiddle in Aktion sehen .

Ich habe einen Join in meiner Lösung verwendet, während Druzin eine korrelierte Unterabfrage in seiner verwendet hat. Probieren Sie beide aus und finden Sie heraus, welche in Ihrer Umgebung schneller ausgeführt werden. MySQL kann sie auf den gleichen Plan reduzieren.

Nick Chammas
quelle
3

Sie sollten LEFT JOINanstelle von verwenden, INNER JOINfalls die Kategorie keine Unterkategorie hat.

     SELECT `parent`.`id`
          , `parent`.`name`
          , COUNT(`child`.`id`) AS `hasChild` 
       FROM `category` `parent` 
  LEFT JOIN `category` `child` 
         ON `parent`.`id` = `child`.`parent_id` 
      WHERE `parent`.`parent_id` = 3780 
   GROUP BY `parent`.`id`
Herr K.
quelle
Wie zählen Sie untergeordnete Zeilen, die eine bestimmte Bedingung erfüllen? Unterabfrage?
Enrique