0

私は現在、ユーザーがギグをホストしているバンドの名前またはギグ自体の場所でギグを検索できる検索機能に取り組んでいます。私が抱えている問題は、検索の場所の部分です。保存した町、郡、および国のフィールドを検索して、ギグの場所が「リーズ、ヨークシャー、イングランド」であり、ユーザーが「 Eng」は国フィールドで見つかったので一致します。リーズでの一致のために「eds」を検索した場合も同様です。

クエリ内で Group By メソッドを使用することでこれを実現できることはわかっていますが、これまで Group By を使用したことがないため、ベスト プラクティスとその正確な適用方法に関するアドバイスを探していました。

私が始めた間違ったクエリは次のとおりです。

<cfquery datasource="#datasource#" name="findgigs">
    Select artist_id, gig_id, gig_artistid, gig_town, gig_county, gig_country
    From artists, gigs
    Where artist_id = gig_artistid
    <cfif IsDefined("URL.search")>
        And gig_town LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%>
        Or gig_county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%>
        Or gig_country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#%>
    </cfif>
</cfquery>

クエリを実行した後に発見したように(事前に知っておく必要があります)、多くの重複が返されます。ただし、そのクエリを見ると、取得しようとしているものが完全に間違った方法で行われていることがわかります。これを改善する方法に関する知識やアドバイスをいただければ幸いです。

4

2 に答える 2

3
<cfquery datasource="#datasource#" name="findgigs">
    SELECT  artist_id
    FROM    artists
    WHERE   artist_id IN 
      (    

           SELECT  gig_artistid 
           FROM    gigs 
           WHERE   1 = 0 
           <cfif structKeyExists(url,'search')>
             OR  gig_town LIKE  <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#">
             OR  gig_county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#">
             OR  gig_country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#">
         </cfif>
      )
</cfquery>
  1. 値の重複が心配な場合は、このサブクエリを使用すると、グループ化せずに問題を解決できます。

  2. SQL インジェクションを防ぐためのベスト プラクティスとして cfqueryparam を追加しました

クエリのロジックは「開始するものを表示しない」であり、検索が定義されている場合、OR が開始され、結果が表示されるようになります。

オプション #2

<cfquery datasource="#datasource#" name="findgigs">
    SELECT artist_id
    FROM   artists
   <cfif structKeyExists(url,'search')>
    WHERE  artist_id IN 
        ( 
           SELECT  gig_artistid 
           FROM    gigs
           WHERE   gig_town LIKE  <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#">
           OR      gig_county LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#">
           OR      gig_country LIKE <cfqueryparam cfsqltype="cf_sql_varchar" value="%#URL.search#">
       )
   </cfif>
</cfquery>

すべてを表示することから始めます。検索基準が追加されると、結果のフィルタリングが開始され、検索基準が含まれるようになります。

于 2013-04-22T12:37:14.250 に答える