2

ページ分割された結果を得るためにテーブルをクエリするときに、合計変数を設定するために行をカウントする別のクエリをよく使用します。

テーブル内の合計ユーザーを返します

SELECT Count(*) FROM users WHERE organizationId = :organizationId

ページ分割された結果を返します

SELECT * FROM users WHERE organizationId = :organizationId LIMIT :start, :end

public SearchResults findAll(User user, Paginator paginator) {
        HashMap<String, Object> namedParameters = new HashMap<String, Object>();
        namedParameters.put("organizationId", user.getOrganizationId());
        namedParameters.put("userId", user.getId());
        NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(dataSource);

        //Get count
        int total = namedParameterJdbcTemplate.queryForInt(SQL_FIND_ALL_COUNT, namedParameters);
        int start = 0;
        int end = total;

        if(paginator != null) {         
            start = paginator.getFirst();
            end = paginator.getCount();
        }

        namedParameters.put("start", start);
        namedParameters.put("end", end);
        SqlRowSet results = namedParameterJdbcTemplate.queryForRowSet(SQL_FIND_ALL, namedParameters);
        return new SearchResults(mapUser(results), total);
    }

合計を収集する唯一の理由は、検索結果の一部としてそれを返すことができるようにするためです。これはページネーションに必要であるため、実際に結果を渡してすべてのレコードを検索しなくても、ユーザーに表示する結果のページ数がわかります。データベース。

1回のクエリでこれを行う方法はありますか? つまり、LIMIT 条件を使用して特定の量 (一度に 10 レコードなど) のみを照会しながら、合計数を取得します。もしそうなら、パフォーマンスの観点から、これらを別々のクエリに保持する方が理にかなっていますか?

このようなもの?

SELECT *, (SELECT Count(*) FROM users WHERE organizationId = :organizationId) FROM users WHERE organizationId = :organizationId"

上記のクエリが機能する場合、実際にそのサブクエリ列を取得するにはどうすればよいですか?参照できる名前はありますか?

results.getInt("count"); //?
4

2 に答える 2

2

2つの観察:

1>カウントクエリでは「*」を使用しないでください。代わりに、次のようなクエリを記述できます。

SELECT Count(1)FROMユーザーWHERE OrganizationId =:organizationId

また

SELECT Count(column1)FROM users WHERE OrganizationId =:organizationId

2> countをサブクエリとして使用することは、複数回実行されてパフォーマンスのオーバーヘッドが増える可能性があるため、お勧めできません。確かに、まだ2つのクエリがあるため、パフォーマンスには何のメリットもありません。

予想される「結果セット」が大きい場合は、2つの異なるクエリを使用することをお勧めします。カウントクエリは最初に1回だけ使用してください。以降のページでは、詳細クエリのみを実行できます。

予想される「結果セット」が小さい場合は、すべての結果をロードして、クライアント側のページ付けを実行して最高のパフォーマンスを得ることができます。その場合、すべてのページに対して1つのクエリのみが実行されます。

于 2012-10-04T04:11:30.543 に答える
2

ALIASサブクエリの後に追加

SELECT  *, 
       (
        SELECT Count(*) 
        FROM users 
        WHERE organizationId = :organizationId
       ) `COUNT`
FROM users
WHERE organizationId = :organizationId

クエリの代替ソリューションは、使用することですCROSS JOIN

SELECT  *, x.totalCount
FROM users, 
       (
        SELECT Count(*) totalCount
        FROM users 
        WHERE organizationId = :organizationId
       ) x
WHERE organizationId = :organizationId
于 2012-10-04T04:01:11.280 に答える