0

このクエリは、特定のtraceid値(この例では50、両方のテーブルに存在するキー)を指定して、必要なデータtblResultsを返しtblTracesます。

SELECT count(changed)
FROM (
    SELECT changed
    FROM tblResults
    WHERE traceid = 50
    AND changed = 1
    ORDER BY resultid DESC
    LIMIT 0,20
) as R

上記のクエリをほぼすべてに対して実行したいと思いますtraceid(つまり、traceid 50だけでなく、traceidごとに20行を選択すると、3つのtraceidは60行を意味します)。以下のこの単純な選択は、必要なtraceid値を取得します。

SELECT `traceid` FROM `tblTraces` WHERE `enabled` = 1

2つのクエリを「接着」するにはどうすればよいですか?

したがって、サブクエリが複数の行を返すために機能しないことを除いて、次のようなクエリを想像します(私が望む):

SELECT count(changed)
FROM (
    SELECT changed
    FROM tblResults
    WHERE traceid = (
                     SELECT `traceid` FROM `tblTraces` WHERE `enabled` = 1
                    )
    AND changed = 1
    ORDER BY resultid DESC
    LIMIT 0,20
) as R
4

5 に答える 5

1

私はこの答えに満足していませんが、小さなテーブルの場合はおそらく最も簡単です。

SELECT tblTraces.traceid, LEAST(20, SUM(tblResults.changed))
FROM tblTraces
    LEFT JOIN tblResults
    ON tblTraces.traceid = tblResults.traceid
WHERE tblTraces.enabled = 1
AND tblResults.traceid.changed = 1
GROUP BY tblTraces.traceid

列の制限により、結合が非常に複雑になります。

于 2013-03-23T21:11:34.040 に答える
1

これを行う別の方法があります。ビルカーウィンの例を採用しました。より詳細な説明については、彼の投稿を参照してください。

SELECT x.traceId、COUNT(*)
から (
  を選択。*
    FROM tblResultsa
    -トレース内の唯一のレコードであるtblResultsを除外しないように注意してください
    LEFT OUTER JOIN tblResults b
      -これの「前」に何行来たかを数えます
      ON a.changed = b.changed
     AND a.traceId = b.traceId
     AND a.resultId <b.resultId
   WHERE a.changed = 1
     AND a.traceId IN(SELECT traceId FROM tblTraces WHERE enabled = 1)
   GROUP BY a.resultId
  HAVING COUNT(*)<20-20より上位にランク付けされた行を削除します
   ORDER BYb.resultIdDESC-resultidでランク付けする場合
)x GROUP BY x.traceId

外側のクエリは、各traceidに20を超える選択されたレコードが含まれていないことを確認するためだけのものであり、内側のクエリは、実際に関心のある結果セットです。

于 2013-03-23T20:51:39.907 に答える
1

これらの(トレースごとに20に制限された)結果または実際の結果のカウントが必要かどうかは正確には明確ではありません。カウントの場合のみ、簡単な方法があります。

  SELECT t.traceid,
         LEAST(COUNT(*),20) AS cnt
  FROM tblTraces AS t
    JOIN tblResults AS r
      ON r.traceid = t.traceid
  WHERE t.enabled = 1
    AND r.changed = 1
  GROUP BY t.traceid ;

SQLでテスト-Fiddle

于 2013-03-23T21:14:58.050 に答える
0

あなたはそのように内部結合をすることができますか

select count(traceid)
  from tblResults a inner join tblTraces b on a.traceid = b.traceid
   and b.enabled = 1
   and a.changed = 1

それとも私はここで何か他のものを逃していますか?

于 2013-03-23T20:33:44.720 に答える
0

MySQLでは、これを行う簡単な方法はありません。他のデータベースでは、を使用するだけですが、使用row_number()できません。

resultId各行で一意であると仮定した場合の1つのアプローチを次に示します。

select t.traceId, count(changed)
from (select traceid, ResultId, changed,
             (select count(*) from tblResults r2 where r2.traceId = r.traceId and r2.ResultId >= r.ResultId and r2.changed = 1) as seqnum
      from tblResults r join
           tblTraces t
           on r.TraceId = t.TraceId and t.enabled = 1
      where r.changed = 1
    ) t
where seqnum <= 20
group by traceId

これを必要とせずtraceid、合計数だけが必要な場合は、を削除してgroup byをに変更selectcount(changed)ます。

于 2013-03-23T20:54:45.923 に答える