2010-08-31 10 views
4

Comment pourrais-je faire l'équivalent de cette instruction dans les données de base? Fondamentalement, je veux obtenir une liste des 10 occurrences les plus de foo w/combien de fois cela se produit.Comment faire cette requête MySQL dans les données de base?

Fondamentalement, j'enregistre toutes mes recherches d'utilisateurs comme des entrées individuelles dans les données de base. Je veux être en mesure de sélectionner leurs 10 articles les plus recherchés et les afficher dans l'ordre commençant w/le plus populaire. Donc, fondamentalement, je veux quelque chose comme:


  • Baa | 10
  • Mer | 8
  • Boîte | 6

etc .....


Merci pour toute aide que vous pouvez fournir. Je suis encore nouveau pour Core Data.

SELECT foo, 
     COUNT(foo) AS occurances 
    FROM bar 
GROUP BY foo 
ORDER BY occurances DESC 
    LIMIT 10; 

Répondre

1

D'abord, créer un Core Data Entity a: userSearchTerm et userSearchDate. Et créez un enregistrement chaque fois qu'une recherche est effectuée.

Démarrez le code en déclarant la demande d'extraction. Et utiliser NSPredicate pour filtrer par date:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserSearches" inManagedObjectContext:managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSPredicate *nameFilter = [NSPredicate predicateWithFormat:@"(userSearchDate like[cd] %@) AND (userSearchTerm like[cd] %@)",weekName,termToFind]; 
[fetchRequest setPredicate:nameFilter]; 

Le [cd] dans le filtre comme le précise ce n'est pas sensible à la casse. Vous devrez peut-être changer ce filtre en fonction de la date et le format que vous souhaitez utiliser

Ensuite, définissez le fetchResultType comme NSDictionaryResultType:

[fetchRequest setResultType:NSDictionaryResultType]; 

Ceci renvoie un dictionnaire que vous pouvez utiliser.

Pour utiliser des fonctions d'agrégation, vous devez utiliser NSExpressionDescription

Ceci est un code vaste et je ne suis pas en mesure de tester correctement pour vous, mais vous pouvez le lire ici. Sur la section Valeurs spécifiques Récupérer, il décrit comment faire les fonctions d'agrégation: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html

Pour une référence de toutes les fonctions globales disponibles pour NSExpression vont fonctionner expressionForFunction: arguments: où la liste se trouve.

+0

Merci pour la réponse. J'ai essayé d'utiliser: NSExpression * countNameExpression = expressionForFunction: arguments: w/count: puis l'exécution de la requête d'extraction, mais cela me donne le nombre total. Des idées sur ce que je fais mal? –

+0

Avez-vous utilisé NSPredicate avant de filtrer ceux pour la date spécifique et pour le terme de recherche? Je modifie la réponse pour inclure une instruction "AND" dans le prédicat – elcool

+0

Voilà le problème. Je n'ai pas de terme de recherche. Je veux juste que tous les termes de recherche de cette période soient listés dans l'ordre du nombre de fois qu'ils se sont produits. –

0

Les données de base ne prennent pas en charge les expressions d'agrégation. Je suggère que vous changiez votre modèle. Votre entité dit "Recherche" aura deux attributs, searchTerm et les occurrences. Lorsque vous effectuez une nouvelle recherche, vérifiez si le searchTerm donné existe déjà, si c'est le cas, augmentez les occurrences si vous n'insérez pas une nouvelle entité. Lorsque vous souhaitez afficher les dix premiers, vous pouvez trier les objets par occurrences et afficher les 10 premiers éléments.

MISE À JOUR: En fonction de votre besoin de présenter les recherches les pour aujourd'hui/mois/année au lieu de « tous les temps » dans la question, selon le documentation vous devrez le faire en deux étapes. En supposant que votre entité, SearchEvent, a des attributs searchTerm et searchDate:

  1. Utilisez NSPredicate pour revenir tous SearchEvents après une date donnée
  2. ITERATE sur les résultats pour agréger le nombre d'occurrences de searchTerm. Utilisez NSMutableDictionary pour le groupe

Ceci est potentiellement une opération coûteuse, donc il est logique pour vous de garder les résultats dans un cache que vous mettez à jour en arrière-plan

+0

J'ai pensé à cela mais le problème est que je veux être en mesure d'afficher les plus populaires au cours de la dernière semaine, mois et année. Des idées sur la façon d'accomplir cela? –

+0

Réponse mise à jour compte tenu des nouvelles exigences – falconcreek

+0

Je lis aussi dans les docs du développeur que Core Data ne supporte pas les expressions d'agrégation ... mais ensuite sur cette page dans les docs: Outils Xcode pour Core Data http://developer.apple.com/ library/mac/# documentation/DeveloperTools/Conceptuel/XcodeCoreDataTools/Articles/xcdPredicateBuilder.html il montre clairement en bas une image avec un @avg dans l'éditeur d'expression. Étrange. –

Questions connexes