私はこのようなものを持っています:
SELECT id, fruit, pip
FROM plant
WHERE COUNT(*) = 2;
この奇妙なクエリは自明だと思います。COUNT(*)
ここでは、plant
テーブルの行数を意味します。私の要件は、テーブル内の行の総数 = 2 の場合にのみ、指定されたフィールドから値を取得する必要があることです。これは機能しませんが、invalid use of aggregate function COUNT
.
これはできない:
SELECT COUNT(*) as cnt, id, fruit, pip
FROM plant
WHERE cnt = 2;
1 つは、出力される行数を 1 に制限し、2 つは同じエラーを返しますinvalid use of aggregate function
。
私ができることは、代わりに次のとおりです。
SELECT id, fruit, pip
FROM plant
WHERE (
SELECT COUNT(*)
FROM plant
) = 2;
しかし、そのサブクエリはメインクエリの再実行です。問題の大部分の小さな例をここに示していますがCOUNT(*)
、与えられた例の追加のサブクエリがそれほど大きなオーバーヘッドではないことはわかっています。
編集:質問が反対票を投じられた理由がわかりません。COUNT(*)
私が取得しようとしているのは、クエリのビュー (一時テーブル) からのものです。これは、5 ~ 6 個の結合と追加の where 句を含む大きなクエリです。カウントを取得するためにクエリをサブクエリとして再実行するのは効率が悪く、ボトルネックもわかります。
実際のクエリは次のとおりです。
SELECT U.UserName, E.Title, AE.Mode, AE.AttemptNo,
IF(AE.Completed = 1, 'Completed', 'Incomplete'),
(
SELECT COUNT(DISTINCT(FK_QId))
FROM attempt_question AS AQ
WHERE FK_ExcAttemptId = @excAttemptId
) AS Inst_Count,
(
SELECT COUNT(DISTINCT(AQ.FK_QId))
FROM attempt_question AS AQ
JOIN `question` AS Q
ON Q.PK_Id = AQ.FK_QId
LEFT JOIN actions AS A
ON A.FK_QId = AQ.FK_QId
WHERE AQ.FK_ExcAttemptId = @excAttemptId
AND (
Q.Type = @descQtn
OR Q.Type = @actQtn
AND A.type = 'CTVI.NotImplemented'
AND A.IsDelete = @status
AND (
SELECT COUNT(*)
FROM actions
WHERE FK_QId = A.FK_QId
AND type != 'CTVI.NotImplemented'
AND IsDelete = @status
) = 0
)
) AS NotEvalInst_Count,
(
SELECT COUNT(DISTINCT(FK_QId))
FROM attempt_question AS AQ
WHERE FK_ExcAttemptId = @excAttemptId
AND Mark = @mark
) AS CorrectAns_Count,
E.AllottedTime, AE.TimeTaken
FROM attempt_exercise AS AE
JOIN ctvi_exercise_tblexercise AS E
ON AE.FK_EId = E.PK_EId
JOIN ctvi_user_table AS U
ON AE.FK_UId = U.PK_Id
JOIN ctvi_grade AS G
ON AE.FK_GId = G.PK_GId
WHERE AE.PK_Id = @excAttemptId
-- AND COUNT(AE.*) = @number --the portion in contention.
上記のクエリを無視して、私が投稿した小さなクエリの例から正しい方向に導いてください。