6

MySQL で、選択した行と結果行の数を返す単一の SQL ステートメントを実行する方法はありますか?

私がすることができます:

SELECT COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';

これにより、カウント (37,781) を含む単一の結果行が得られます。次のように実際の行データを取得できます。

SELECT firstname FROM BigTable WHERE firstname LIKE 'a%';

実際の 37,781 行が表示されます。しかし、それらを組み合わせようとすると、次のようになります。

SELECT firstname, COUNT(*) FROM BigTable WHERE firstname LIKE 'a%';

クエリに一致する最初の行と、クエリに一致するレコードの総数を含む単一の行を取得します。

私が見たいのは、37,781 行の 2 列です。最初の列には各行の最初の名前が含まれ、2 番目の列にはすべての行の番号「37,781」が含まれている必要があります。これを達成するためにクエリを書く方法はありますか?

4

4 に答える 4

7

CROSS JOIN を使用できます。サブクエリはすべてのカウントを取得し、firstnames各行にこの値を含めます。

SELECT firstname, d.total
FROM BigTable
CROSS JOIN 
(
   SELECT COUNT(*) total
   FROM BigTable
   WHERE firstname LIKE 'a%'
) d
WHERE firstname LIKE 'a%';

デモで SQL Fiddle を参照してください

于 2013-05-23T00:07:34.773 に答える
3

サブクエリで結合できます。

SELECT firstname, ct
FROM BigTable
JOIN (SELECT COUNT(*) ct
      FROM BigTable
      WHERE firstname LIKE 'a%') x ON (1 = 1)
WHERE firstname LIKE 'a%'
于 2013-05-23T00:03:26.500 に答える
1

以前のバージョンの MySQL ではこれが当てはまったように感じますが、これは私のテストでは機能しません。

しかし、マニュアルによると、http://dev.mysql.com/doc/refman/5.1/en/group-by-functions.html#function_count COUNT(*) が関数ごとのグループであり、当然のことながらすべてのGROUP BYステートメントが添付されていない場合、複数のステートメントまたはサブクエリのいずれかであるという解決策しかわかりません。可能であれば、2 つのクエリを別々に実行することをお勧めしますが、それが不可能な場合は、次を試してください。

SELECT firstname,
    total
  FROM BigTable,
  ( SELECT COUNT(*) AS total
      FROM BigTable ) AS dummy
  WHERE firstname LIKE 'a%';
于 2013-05-23T00:07:47.297 に答える