2016-04-11 6 views
0

私はsomething similarにこれまでに質問されていますが、私はそれを理解しているようです。私は私のcordovaアプリでSQLデータベースから2つの配列を持っています。これらの2つの配列を組み合わせて、検索クエリに最適な順序で並べ替えることは可能ですか?検索用語に基づいて関連性の高い複数のJavaScript配列をマージして並べ替えます

私のアプリでは、複数のローカルテーブルと注文を最もよく検索する検索機能があります。これは細かい

SQLクエリの例を動作します:

tx.executeSql("SELECT * FROM contacts WHERE f_name LIKE ? ORDER BY (CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END), f_name ",["%" + query + "%", query, query + "%"],onSuccess, onError); 

このプロセスが繰り返され、異なるアレイが異なるテーブルが検索されているために作成されます。

私は、ユーザー用とメッセージ用の2​​つのテーブルが1つ残っています。 SQLクエリを実行した後にコールバック関数は、その後1つの配列にすべての結果をソートします。

var allResults = []; 
// create an array of all 

for(var x = 0; x < allChatSearchResults.users.length; x++){ 
    var result = allChatSearchResults.users[x]; 
    result['type'] = 'user'; 
    allResults[allResults.length] = result; 
} 
for(var x = 0; x < allChatSearchResults.messages.length; x++){ 
    var result = allChatSearchResults.messages[x]; 
    result['type'] = 'message'; 
    allResults[allResults.length] = result; 
} 

は、私は、配列をループしallResultsを使用して、検索クエリに一致するように、この配列を並べ替えることができます方法はあります。

allResults = [ 
{ 
    type : 'user', 
    f_name : 'username', 
    l_name : 'somename' 
}, 
{ 
    type : 'message', 
    message : 'this is my user name', ////// query from sql matches this 
    date : '11/04/2016' 
}, 
{ 
    type : 'message', 
    message : 'another containing username', ////// query from sql matches this 
    date : '09/04/2016' 
}, 
//and so on 
]; 

全コード:

var searchResultsSource = 0; 
var allChatSearchResults = {users : [], messages : []}; 
var searchChatResults = function (type, query, res){ 
    searchResultsSource++; 
    if(res.length > 0){ 
     for(var x = 0; x < res.length; x++){ allChatSearchResults[type][x] = res[x]; } 
    } 
    if(searchResultsSource == 2){ 
     //run the function 
     console.log('Search Results', allChatSearchResults); 
     var allResults = []; 
     // create an array of all 
     for(var x = 0; x < allChatSearchResults.users.length; x++){ 
      var result = allChatSearchResults.users[x]; 
      result['type'] = 'user'; 
      allResults[allResults.length] = result; 
     } 
     for(var x = 0; x < allChatSearchResults.messages.length; x++){ 
      var result = allChatSearchResults.messages[x]; 
      result['type'] = 'message'; 
      allResults[allResults.length] = result; 
     } 
     // create an array of just search query 

     // reorder the array based on the ordered search query 


    } 
}; 
var searchChats = function() { 
    var query = $('#activeChatSearch').val(); 
    query = query.toLowerCase(); 
    if(query.length > 3){ 
     //search my chats 
     //search users and search messages 
     db.transaction(function(tx) { 
      var users = []; 
      var chats = []; 
      var messages = []; 
      tx.executeSql("SELECT * FROM contacts WHERE f_name LIKE ? ORDER BY (CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END), f_name ",["%" + query + "%", query, query + "%"], function (tx, res){ 
       if(res.rows.length == 0){ console.log('no users with first name ' + query); } 
       for(var x = 0; x < res.rows.length; x++){ users[x] = res.rows.item(x); } 
       searchChatResults('users', query, users); 
      }, function (tx, error){ 
       console.log(error.message); 
      }); 
      tx.executeSql("SELECT * FROM active_chats ORDER BY last_changed DESC", [], function (tx, res){ 
       if(res.rows.length > 0){ 
        var count = 0; 
        var max = res.rows.length; 
        var results = res.rows; 
        var searchThisChat = function (tx, query, chatID){ 
         tx.executeSql("SELECT * FROM chat_" + chatID + " WHERE message LIKE ? ORDER BY (CASE WHEN message = ? THEN 1 WHEN message LIKE ? THEN 2 ELSE 3 END), message LIMIT 0,1", ["%" + query + "%", query, query + "%"], function (tx, res){ 
          if(res.rows.length == 0){ /*console.log('No chats match query',messages); */ } 
          else { messages[messages.length] = res.rows.item(0); } 
          if(count == max){ searchChatResults('messages', query, messages); } else{ searchThisChat(tx, query, results.item(count).chat_id); count++; } 
         }, function (tx, e){ 
          console.log(e.message); 
          if(count == max){ searchChatResults('messages', query, messages); } else{ searchThisChat(tx, query, results.item(count).chat_id); count++; } 
         }); 
        }; 
        searchThisChat(tx, query, res.rows.item(0).chat_id); 
       } 
      }, function (tx, e){ 
       console.log(e.message); 
      }); 
     }, function(err) { 
      console.log('Open database ERROR: ', err); 
     }); 

     var activeChats = $('#activeChats'); 
     activeChats.html(''); 
     for(var x = 0; x < 6; x++){ 
      var item = formatCurrentChatItem(
       {f_name : query, l_name : 'Bloggs', 'user_id' : 18}, 
       null, 
       null 
      ); 
      item.appendTo(activeChats); 
     } 
    } 
}; 
$(function() { 
    $('#activeChatSearch').on('input', searchChats); 
    $('#activeChatSearchBtn').on('click', searchChats); <- input function 
}); 
+0

あなたの質問は不明です。サンプルの入力と必要な出力を提供する – Amit

+0

完全な機能を持っているだけで、少し長めにしてみました。 –

+0

あなたの編集は(残念ながら)悪い編集です。あなたの完全なコードは必要ありません。 **サンプル入力と必要な出力**を提供する必要があります。それに失敗した場合は、関連コード(**のみ**関連コード)を含めてください。 – Amit

答えて

2

あなたが返されるSQLでの関連性スコアを含めていないとは、そこにある

配列出力は、「ユーザー」の検索のために、このようなものです2つの配列を結合する方法はありません。

まず、あなたのSQLの一部としてスコアを戻しますする必要があります。

tx.executeSql("SELECT *,(CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END) as Score FROM contacts WHERE f_name LIKE ? ORDER BY (CASE WHEN f_name = ? THEN 1 WHEN f_name LIKE ? THEN 2 ELSE 3 END), f_name ",["%" + query + "%", query, query + "%"],onSuccess, onError);

その後、あなたは「スコア]列で配列して並べ替えを組み合わせることができるようになります:

allResults.sort(function(a,b){ return a.Score-b.Score; });

+0

私はそれを行うことができたことを知っています、それはSQLの問題はJavaScriptではないことがわかります。ありがとう@binarymax –

+0

@PaulLedgerをお手伝いします。これがあなたの質問に答えた場合、それを合格とマークすることを検討してください。 – binarymax

+0

問題ありません@binarymax –

関連する問題