2017-08-24 27 views
1

私たちはcoldfusionでページネーションを実装しようとしています.Sqlクエリーを変更してデータの数だけを取得し、次のボタンをクリックすると、次のデータセットを照会する必要があります。coldfusionでのページ設定の実装

SELECT History.*,User.FirstName,User.LastName 
    FROM History 
    LEFT OUTER JOIN User ON History.UserID = User.UserID 
    WHERE History.UserID = <CFQUERYPARAM VALUE="#UserID#" CFSQLTYPE="CF_SQL_INTEGER"> 
    AND Type IS NOT NULL 
    AND SubType IS NOT NULL 
    ORDER BY #OrderBy# #sort# 

上記のクエリを使用して同じことを行うことができます。

例クエリ:

SELECT * FROM (
     SELECT ROW_NUMBER() OVER(ORDER BY SearchID) AS NUMBER, 
       * FROM search_history 
       WHERE UserID=111 
       AND Date >= #DateVal#  
      ) AS TBL 
    WHERE NUMBER BETWEEN ((#pageNum# - 1) * #MaxRows# + 1) AND (#pageNum# * #MaxRows#) 
    ORDER BY #OrderBy# #sort# 
+0

ORDER BYのSQLインジェクションに注意してください。 ColdFusionとSQLのどのバージョンですか? – Shawn

答えて

1

まず、これはSQL ServerとないのColdFusionの問題です。 ColdFusionでインラインでクエリを生成するだけです。ストアドプロシージャとしてこのクエリを作成すると、インラインクエリよりもパフォーマンスが優れている方が良いでしょう。

次に、this answerは私が転記している例の基礎となります。 SQL ServerはOFFSETLIMITをサポートしていないため、ページングが簡単に行えません。これらはMySQLとpostgreSqlに永遠にありました。

第3に、SQL Server 2012の時点で、OFFSETFETCH(本質的にはLIMIT)のサポートが追加されました。その動作方法のHere is a good example

この例では、SQL @parametersを使用しています。理想的には、これらをストアドプロシージャで宣言しますが、インラインクエリで宣言して設定することができます。 SQL Injectionの攻撃から保護するには、cfqueryparamを必ず使用してください。

SELECT * 
FROM (
    SELECT 
     h.column1 
     , h.column2 
     , u.FirstName 
     , u.LastName 
     , SELECT ROW_NUMBER() OVER (ORDER BY @ORDER_BY @SORT_ORDER) AS RowNum 
    FROM 
     dbo.History h 
    INNER JOIN 
     dbo.User u ON h.UserID = u.UserID 
    WHERE 
     h.UserID = @USER_ID 
     AND 
     h.Type IS NOT NULL 
     AND 
     h.SubType IS NOT NULL 
) AS HistorySearch 
WHERE 
    RowNum >= @ROW_START 
    AND 
    RowNum < @ROW_END 
ORDER BY 
    RowNum 
ページ番号とページサイズの変数に基づいて、 ROW_STARTROW_ENDの値を計算するとよいでしょう。

最後に、メインの選択クエリでSELECT *を使用しないでください。それは悪い習慣です。

0

返すデータの量によっては、通常はクエリを実行し、コールドフュージョンを使用して出力をページ設定できます。そして、あなたが良い考えであるクエリで*を使うのを避けることができるなら。

<cfparam name="StartAt" default="1"> 
<cfparam name="MaxRows" default="100"> 

<cfoutput name="QueryName" startrow="#StartAt#" maxrows="#maxRows#" > 

変数MaxRowsおよびStartAtはフォームに設定され、ユーザーが[次へ]または[前へ]をクリックすると渡されます。

結果セットが非常に大きい場合は、返されたデータを制限する方が良いでしょう。

+0

クエリ結果が非常に大きく、その間にアプリケーションがクラッシュします。代替案を考え始めました。 –

関連する問題