web-dev-qa-db-ja.com

1つのクエリで親IDが0の行と等しい親IDを持つ行の数

MySQLを使用して1つのクエリで次のことを実行したいと思います。

  • parent_idが0の行を取得する
  • 取得した、parent_idが0の行のparent_idを持つすべての行の数を取得します。

これを1つのクエリで実行するにはどうすればよいですか? 詳細が必要な場合はお知らせください。喜んでお手伝いします私はできる限り支援します。私は作成の専門家ではありません質問があるので、必要な情報を教えてください。

これが私が今やっていることの例です:

select id from messages where parent_id=0

その後

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

ワンショットクエリを取得するにはどうすればよいですか?何かのようなもの...

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

または、これを処理するためのより良い方法はありますか?なるほど、現時点では、カウントを見つけるために大量のクエリを実行する必要があります。

8
jkushner

これは、インラインのサブクエリで簡単に実現できます。

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

group byはサブクエリが使用されるため必要です。

6
druzin

このクエリは、必要な出力を提供します。

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;

このコードを実際に見ることができます ここではSQL Fiddle

私のソリューションでは結合を使用しましたが、druzinでは相関サブクエリを使用しました。両方を試してみて、どちらが環境で速く動作するかを確認してください。 MySQLはそれらを同じ計画に減らすかもしれません。

3
Nick Chammas

カテゴリにサブカテゴリがない場合は、LEFT JOINではなくINNER JOINを使用する必要があります。

     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`
3
Mr. K