2

単純に 2 つのテーブルを結合する SQL クエリがあります。1 つのテーブルにはコメントが含まれ、もう 1 つはユーザー テーブルです。テーブルを結合して、コメントを書いたユーザーに関するユーザー情報 (ユーザー名) を取得すると同時に、コメント (コメント テキストなど) を取得します。

ここで、コメントの数を数えて、ページの上部に正しいコメント数を書きたいと思います。これを行うには、COUNT とエイリアスを追加して値を保存します。

numCount をエコーすると、コメントの正しい値が得られますが、コメント ループにコメントがありません。カウントを削除するとすぐに、すべてのコメントが再び表示されます。私は何を間違っていますか?

SELECT
ncID, ncText, ncDate,
uID, uName, uImageThumb,
COUNT(a.ncID) AS numComments
FROM tblNewsComments a LEFT JOIN tblUsers b
ON a.ncUserID = b.uID
WHERE  a.ncNewsID = $newID 
ORDER BY ncDate DESC
4

4 に答える 4

3

他のほとんどの RDBMS はこのクエリで失敗するため、これは MySQL (またはおそらく SQLite) であると想定します。問題は、行セット全体を操作する場合を除きGROUP BY、集計関数を使用するときに必要な句がないことです。COUNT()MySQL の通常とは異なる動作は、 が存在しないことを許可するか、 に含まれていないGROUP BY列を許可することであり、通常とは異なる結果が生成されます。SELECTGROUP BY

COUNT()これを行う適切な方法は、 perを返すサブクエリに参加することncIDです。

SELECT
  ncID,
  ncText,
  ncDate,
  uID,
  uName,
  uImageThumb,
  /* The count returned by the subquery */
  ccount.numComments
FROM
  tblNewsComments a
  LEFT JOIN tblUsers b ON a.ncUserID = b.uID
  /* Derived table returns only ncID and count of comments */
  LEFT JOIN (
    SELECT ncID, COUNT(*) AS numComments 
    FROM tblNewsComments 
    GROUP BY ncID
  ) ccount ON a.ncID = ccount.ncID
WHERE a.ncNewsID = $newID
ORDER BY ncDate DESC

Edit Whoops -元々持っていた count perncIDではなく、 count perが必要だったようです。ncUserID

于 2013-02-09T01:39:48.030 に答える
0

これを試して:

SELECT  
ncID, ncText, ncDate,  
uID, uName, uImageThumb,  
(SELECT COUNT(ncID)   
FROM   
tblNewsComments a  
INNER JOIN  
tblUsers b  
ON a.ncUserID = b.uID)   
AS numComments  
FROM tblNewsComments a LEFT JOIN tblUsers b  
ON a.ncUserID = b.uID  
WHERE  a.ncNewsID = $newID   
ORDER BY ncDate DESC  
于 2013-02-09T02:18:16.023 に答える
0

使用している SQL エンジンはわかりませんが、ここにあるのは有効な SQL ではないため、そのようにフラグを立てる必要があります。

COUNT は集計関数であり、それらをグループまたはテーブル全体にのみ適用できるため、あなたの場合はおそらくそうするでしょう

SELECT
ncID, ncText, ncDate,
uID, uName, uImageThumb,
COUNT(a.ncID) AS numComments
FROM tblNewsComments a LEFT JOIN tblUsers b
ON a.ncUserID = b.uID
WHERE  a.ncNewsID = $newID 
GROUP BY ncID, ncText, ncDate,
uID, uName, uImageThumb
ORDER BY ncDate DESC
于 2013-02-09T01:40:56.433 に答える
0

AGGREGATE 関数 (カウント) を使用していますが、そのカウントから意味を成すには GROUP BY が必要です。

クエリに「GROUP BY [COUNT 以外の他のすべてのフィールド名]」を追加することをお勧めします

于 2013-02-09T01:41:10.753 に答える