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 选择 20 行,而不仅仅是 traceid 50,所以 3 个 traceid 意味着 60 行)。下面这个简单的选择获取所需的traceid值:

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

如何将两个查询“粘合”在一起?

所以我想象一个像下面这样的查询,除了它不起作用,因为子查询返回多行(我想要的):

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

这是另一种方法。我改编了比尔卡尔文的例子。有关更详尽的解释,请参阅他的帖子。

选择 x.traceId,计数(*)
从 (
  选择一个。*
    FROM tblResults
    -- 一定不要排除 tblResults 这是跟踪中唯一的记录
    左外连接 tblResults b
      -- 我们要计算“在”这一行之前有多少行
      ON a.changed = b.changed
     和 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 BY b.r​​esultId DESC -- 当我们按 resultid 对它们进行排名时
) x GROUP BY x.traceId

外层查询仅用于验证每个 traceid 包含不超过 20 条选定记录,内层查询是您真正感兴趣的结果集。

于 2013-03-23T20:51:39.907 回答
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

目前尚不清楚您是否需要对这些(每条迹线限制为 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

在 MySQL 中,没有简单的方法可以做到这一点。在其他数据库中,您只需使用row_number(),但它不可用。

这是一种方法,假设resultId每一行都是唯一的:

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 回答
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 回答