2

このクエリがあり、データベースに結果が表示されます。

mysql> SELECT id FROM jos_content 
       WHERE catid=12 AND state=1 
       AND DATE(publish_up) <= NOW() ORDER BY DATE(publish_up) DESC LIMIT 0,5;
    +----+
    | | ID |
    +----+
    | | 48 |
    | | 47 |
    | | 46 |
    +----+
    3 行セット (0.00 秒)

今、私は結果を数えたいと思います:

mysql> SELECT count(*), id FROM jos_content 
       WHERE catid=12 AND state=1 
       AND DATE(publish_up) <= NOW() ORDER BY DATE(publish_up) DESC LIMIT 0,5;
    +------------+----+
    | | カウント(*) | ID |
    +------------+----+
    | | 3 | 46 |
    +------------+----+
    セットで 1 行 (0.00 秒)

48 と 47 の結果が表示されないのはなぜですか?

前もって感謝します

4

2 に答える 2

3

GROUP BY句を含める必要があります。デフォルトでは、MySQL はSELECTa にも含まれていない句内の列を許可しますGROUP BY(これは他のほとんどの RDBMS ではエラーです)。がないとGROUP BY、MySQL は関連付けられた列の最初のものを返しますが、これは多くの場合、意図した正しい結果ではありません。

SELECT 
  count(*), 
  id
FROM jos_content
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
GROUP BY id
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;

のすべての列を必要としないGROUP BYことは、次のように、常に一意である複数の列をサマリーに返したい場合に役立ちますがnameid集計が正しく機能して生成するには、少なくとも 1 つの列をグループ化する必要がありますまとめ:

SELECT 
  id,
  name,
  COUNT(*)
FROM tbl
GROUP BY id

他の RDBMS との互換性とバグを回避するために、すべての列を常に明示的に含めることをお勧めします。SELECTGROUP BY

アップデート

あなたが試みたことをよりよく理解して、各行のIDの横にあるすべての行の合計数が必要な場合は、SELECTリストのように副選択を使用できます。ただし、これは少し遅くなります。

SELECT
  id,
  (SELECT COUNT(*) FROM jos_content) AS numitems
FROM jos_content
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;

サブクエリのカウントに対してデカルト結合 (句なし) を実行することで、これを少し高速に動作させることができるONため、行ごとに実行されないようにすることができます。これは、サブクエリが正確に 1 行を返す場合にのみ行ってください。

SELECT
  id
  numitems
FROM 
  jos_content
  /* Join with no ON clause */
  JOIN (SELECT COUNT(*) AS numitems FROM jos_content) subq
WHERE catid=12 AND state=1 AND DATE(publish_up) <= NOW() 
ORDER BY DATE(publish_up) DESC
LIMIT 0,5;
于 2012-05-11T14:02:04.990 に答える
0

Count は集計関数であるため、いずれかの列を含める場合は、その列をクエリの group by 句の一部にする必要があります。

于 2012-05-11T14:05:03.190 に答える