0

次のようなクエリがあります。

SELECT rank, COUNT(distinct member_id) mcount
FROM my_table
GROUP BY rank
order by
field(rank, 1,2,3,4,5,6,7,8,9,10,0);

それは私にリストを与え、時にはカウント結果が0であるため、ランクが表示されない場合があります。次に例を示します。

rank | mcount
1    | 2
3    | 2
4    | 2
5    | 2
6    | 2
7    | 2
8    | 2
9    | 2
10   | 2

ランクが見えて見え2ない0ので、次のようにカウントして表示してもらいたいです0

rank | mcount
1    | 2
2    | 0
3    | 2
4    | 2
5    | 2
6    | 2
7    | 2
8    | 2
9    | 2
10   | 2
0    | 0

これを達成するにはどうすればよいですか?

4

1 に答える 1

1

0 から 10 までの値を持つテーブルが必要です。ゼロを含めているため、AUTO_INCREMENTこれらのテーブルはデフォルトで 1 から始まるため、通常はテーブルを使用できません。

これらの値を含むテーブルを作成できます。たとえば、次の例では、値が 0 ~ 10 のテーブルが作成されます。

CREATE TABLE IF NOT EXISTS ids (
    i TINYINT UNSIGNED AUTO_INCREMENT NOT NULL PRIMARY KEY
) ENGINE=InnoDB;

SET sql_mode='NO_AUTO_VALUE_ON_ZERO';

INSERT INTO ids
SELECT 0 UNION
SELECT NULL; -- insert 0 and 1

INSERT INTO ids
SELECT NULL FROM
 ids a
,ids b
,ids c
,ids d
LIMIT 9; -- insert 2 thru 10

または、次を使用できます。

   SELECT a.i * 4 + b.i AS i FROM
     (SELECT a.i * 2 + b.i AS i FROM (SELECT 0 AS i UNION SELECT 1) a, (SELECT 0 AS i UNION SELECT 1) b) a,
     (SELECT a.i * 2 + b.i AS i FROM (SELECT 0 AS i UNION SELECT 1) a, (SELECT 0 AS i UNION SELECT 1) b) b
   ORDER BY 1
   LIMIT 11

これは、0 から 10 までの数字を返します。

idsテーブルを使用すると、クエリは次のようになります。

SELECT ids.i rank, IFNULL(COUNT(distinct my_table.member_id), 0) mcount
FROM ids
INNER JOIN my_table ON my_table.rank = ids.i
GROUP BY ids.i
order by
field(ids.i, 1,2,3,4,5,6,7,8,9,10,0);

またはSELECTクエリを使用すると、クエリは次のようになります。

SELECT ids.i rank, IFNULL(COUNT(distinct my_table.member_id), 0) mcount
FROM 
(
SELECT a.i * 4 + b.i AS i FROM
  (SELECT a.i * 2 + b.i AS i FROM (SELECT 0 AS i UNION SELECT 1) a, (SELECT 0 AS i UNION SELECT 1) b) a,
  (SELECT a.i * 2 + b.i AS i FROM (SELECT 0 AS i UNION SELECT 1) a, (SELECT 0 AS i UNION SELECT 1) b) b
ORDER BY 1
LIMIT 11
) ids
INNER JOIN my_table ON my_table.rank = ids.i
GROUP BY ids.i
order by
field(ids.i, 1,2,3,4,5,6,7,8,9,10,0);
于 2013-05-09T22:35:41.763 に答える