2

この選択を行う方法がわかりません。これが私のテーブル構造です。

CREATE TABLE `my_table` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `step` int(2) NOT NULL DEFAULT '0',
  `title` varchar(200) NOT NULL,
  `description` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 ;

ステップ列には、0 から 7 までの整数が含まれます。ステップ 1 から 6 の範囲で、テーブルにあるレコードの数を数えようとしています。COUNT がゼロに等しい場所を含め、範囲全体 (1 から 6) が必要です。順番に戻ってきてほしい・・・こんな感じ。

+----------+----------+
|   step   |     n    |
+----------+----------+
|   Step 1 |     100  |
+----------+----------+
|   Step 2 |     150  |
+----------+----------+
|   Step 3 |     135  |
+----------+----------+

このための手順を定義する必要がないことを望んでいました。必要なものを取得する簡単な方法はありますか?

4

2 に答える 2

3
SELECT
    s.step
  , COALESCE(t.n, 0) AS n
FROM
        ( SELECT 1 AS step UNION ALL
          SELECT 2 UNION ALL
          SELECT 3 UNION ALL
          SELECT 4 UNION ALL
          SELECT 5 UNION ALL
          SELECT 6 
        ) AS s
    LEFT JOIN
        ( SELECT step 
               , COUNT(*) AS n 
          FROM my_table 
          GROUP BY step 
        ) AS t
      ON t.step = s.step
ORDER BY
    s.step ;
于 2012-12-27T20:48:51.750 に答える
1

次のように、すべての有効なステップをリストした表を作成した方が簡単かもしれません。

CREATE TABLE steps (
  step int(2) NOT NULL PRIMARY KEY
);
INSERT INTO steps VALUES (1),(2),(3),(4),(5),(6);

次に、LEFT JOINそれに対して a を実行して、レコード数を取得できます ( SQLize ):

SELECT
  step, COUNT(id) AS n 
FROM
  steps LEFT JOIN my_table USING (step) 
GROUP BY step;

重要な部分は、列が null でないCOUNT(id)行のみをカウントすることです。idは null 以外の列として定義されているためid、それ以外の場合はレコードを持たないステップの左結合によって作成されたダミー行のみを割り引くことを意味します。

もちろん、実際のテーブル (または一時的なテーブル) を本当に作成したくない場合は、ypercube のサブセレクトUNION ALLトリック ( SQLize )を使用してこれを行うこともできます。

SELECT step, COUNT(id) AS n
FROM 
  ( SELECT 1 AS step UNION ALL
    SELECT 2 UNION ALL
    SELECT 3 UNION ALL
    SELECT 4 UNION ALL
    SELECT 5 UNION ALL
    SELECT 6 
  ) AS steps
LEFT JOIN my_table USING (step)
GROUP BY step;
于 2012-12-27T21:07:10.253 に答える