哑SQL问:从查询中计数

时间:2017-09-08 16:44:51

标签: sql postgresql

我确信这可能会被复制,但我不能在我的生活中弄清楚SQL查询中发生了什么。目前我正在运行两个单独的查询1)。收集我想要的表格内容和2)。运行相同的查询只是计算...

首先,它是postgres。在查询中,它是由限制条款分页的,所以我认为我的开始不好,但我问一个愚蠢的问题已经可能已经承诺了。

SELECT *
        FROM test_case_versions v
            INNER JOIN test_cases t ON v.version_id = t.current_version
            LEFT OUTER JOIN categories_full c ON c.category_id = t.category_id
            INNER JOIN test_case_labels tcl ON tcl.test_case_id = t.test_case_id
            INNER JOIN labels l on l.label_id = tcl.label_id
        WHERE c.product_id = " . $user->product_id . "
            AND label_name ILIKE '$search2'
        ORDER BY t.test_case_id ASC
        LIMIT " . SEARCH_RESULTS_PER_PAGE . " OFFSET $offset";

因此该声明会给我一个result_set,但由于下面的限制条款,我只能将100个结果交给15000。 有没有办法在我运行我的限制条款来计算总结果之前,或者这是不可能的?

非常感谢任何帮助

2 个答案:

答案 0 :(得分:3)

这样的事情可能有用。

SELECT *
  FROM (SELECT v.*,
               t.*,
               c.*,
               tcl.*,
               l.*,
               COUNT(*) OVER() AS cnt
          FROM test_case_versions v
         INNER 
          JOIN test_cases t 
            ON v.version_id = t.current_version
          LEFT 
          JOIN categories_full c 
            ON c.category_id = t.category_id
         INNER 
          JOIN test_case_labels tcl 
            ON tcl.test_case_id = t.test_case_id
         INNER 
          JOIN labels l 
            ON l.label_id = tcl.label_id
         WHERE c.product_id = " . $user->product_id . "
           AND label_name ILIKE '$search2'
       ) AS TMP
 ORDER 
    BY test_case_id ASC
 LIMIT " . SEARCH_RESULTS_PER_PAGE . " OFFSET $offset";

答案 1 :(得分:2)

我得到了很多这个问题,我的答案总是一样的:你为什么要知道行的确切数量?当你在Google中查找某些内容时,你是否看过点击次数,如果你这样做,你认为这是一个确切的数字吗? 分页结果的全部目的是限制服务器(以及网络)的负担,如果你对所有记录进行计数,就会失去这种目的。