-2

私は次のことをしたい:

SELECT count(id) FROM table WHERE value BETWEEN 3 AND 40;

ただし、次のことを行う必要があります。

SELECT count(id) FROM table WHERE value IN(3, 4, 5, 6, 7, 8, 9, 10, 11, ..., 40);

値が 3 から 40 の場合はゼロのカウント (id) を出力する必要がありますが、値 = x は出力しません。値がシーケンス (1、2、3、4、...、50) 内にあるかどうかを確認したい。

mysqlでこれを達成する方法を知っている人はいますか?

ありがとう。

4

4 に答える 4

1

MySQL には再帰機能がないため、NUMBERS テーブル トリックを使用する必要があります。

  1. 増加する数値のみを保持するテーブルを作成します - auto_increment を使用して簡単に実行できます:

    DROP TABLE IF EXISTS `example`.`numbers`;
    CREATE TABLE  `example`.`numbers` (
      `id` int(10) unsigned NOT NULL auto_increment,
       PRIMARY KEY  (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
    
  2. 以下を使用してテーブルに入力します。

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...必要な数の値に対して。

  3. これにより、カウントを表示する値のリストが返されます。

    SELECT n.id
      FROM NUMBERS n
     WHERE n.id BETWEEN 3 AND (? - 1)
        OR n.id BETWEEN (? + 1) AND 40
    
  4. 既存のテーブルに LEFT JOIN して、COUNT がゼロの場所を確認します。

      SELECT x.id AS value,
             COALESCE(COUNT(y.id), 0) AS cnt
        FROM (SELECT n.id
                FROM NUMBERS n
               WHERE n.id BETWEEN 3 AND (? - 1)
                  OR n.id BETWEEN (? + 1) AND 40) x
    LEFT JOIN YOUR_TABLE yt ON yt.value = x.id
     GROUP BY x.id
    
于 2010-08-23T18:17:18.067 に答える
0

あなたが探しているのは次のようなものだと思います:

SELECT value, count(id) FROM table
WHERE value BETWEEN 3 AND 40
GROUP BY value

しかし、それは存在しない値に対して count(id) = 0 行を与えることはありません。

于 2013-06-03T23:43:31.627 に答える
0

あなたが探しているものの推測は次のとおりです。

select c.Value,  count(t.Value) as Count
from (
    select 3 as Value
    union all select 4
    union all select 5 
    union all select 6 
    union all select 7 
    union all select 8 
    union all select 9 --add more as needed
) c
left outer join MyTable t on c.Value = t.Value
group by c.Value
于 2010-08-23T18:12:03.877 に答える
0

私があなたの質問を理解したと仮定します:

SELECT count(id) FROM table WHERE value >= 3 AND value <= 40 AND value != 'x'

編集:私はあなたが何を意味するか知っていると思います

SELECT COALESCE(count(id),0)  FROM table WHERE value BETWEEN 3 AND 40;
于 2010-08-23T18:09:06.183 に答える