2016-04-11 33 views
0

Bunun için daha önce sorulmuş something similar olduğunu düşünüyorum, ancak bunu anlayamıyorum. Cordova uygulamasında bir SQL veritabanından iki dizim var. Bu iki diziyi birleştirmek ve arama sorgusuyla en iyi eşleşmeyi sağlamak mümkün mü?Birden çok JavaScript dizisini, bir terime göre alaka düzeyi ile birleştirme ve sıralama

Uygulamamda, birden çok yerel tabloyu ve siparişi en iyi eşleşmeyle arayan bir arama işlevine sahibim. Bu ince

SQL Sorgu Örnek çalışır:

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); 

bu işlem tekrarlanır ve farklı diziler farklı tablolar Aranan için oluşturulur.

Biri kullanıcılar için, biri de mesaj içeriği için olmak üzere 2 tablo bıraktım. SQL sorguları ardından çağrı geri fonksiyonu çalıştırmak 1 diziye Sonuçları sıralar sonra:

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; 
} 

bir yöntem i arama sorgusuyla eşleşecek şekilde diziye döngü allResults kullanabilir ve bu diziyi yeniden düzenleyebilirsiniz var mı .

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 
]; 

Tam Kod:

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

Sorunuz belirsiz. Örnek bir giriş sağlayın ve gerekli çıkış – Amit

+0

Tam işlevini gösteriyorum, uzun bir süre kısaltmaya çalıştım sadece –

+0

Düzenlemeniz (maalesef) kötü bir düzenleme. Tam kodunuz gerekli değildir. ** örnek giriş ve gerekli çıktı ** sağlamanız gerekir. Başarısız bir girişiminiz varsa, ilgili kodu (** sadece ** ilgili kodu) ekleyin. – Amit

cevap

2

döndürülen SQL alaka puanı dahil edilmediğinden, orada

dizi çıktısı 'user' bir arama için böyledir iki diziyi birleştirmenin yolu yok.

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

:

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);

Sonra ve sıralama 'Puanı' sütununa göre diziler birleştirmek mümkün olacak:

Öncelikle SQL bir parçası olarak puan dönmek gerekiyor

+0

arama sorgusu içeren arama sorgusu arama istemedi, wow bunu yapabileceğini bilmiyordum, bir javascript değil bir sql madde oldu. Teşekkür @binarymax –

+0

Yardım @PaulLedger için mutlu. Bu, sorunuzu cevapladıysa, lütfen kabul edildi olarak işaretlemeyi düşünün. – binarymax

+0

Sorun değil @binarymax –