2010-03-23 7 views
1

Je suis bloqué sur la façon d'implémenter cette requête - c'est assez similaire à la requête que j'ai publiée plus tôt mais je ne suis pas capable de la casser.Requête Sql - sélection des 5 premières lignes et sélection des lignes uniquement si l'utilisateur est présent

J'ai une table de magasinage où chaque fois qu'un utilisateur achète quelque chose, un enregistrement est inséré.

Certains champs sont

* shopping_id (primary key) 
* store_id 
* user_id 

Maintenant, ce que je dois est de tirer seulement la liste de ces magasins où il est parmi les 5 premiers visiteurs:

Quand je le décomposer - c'est ce que Je veux accomplir:

* Find all stores where this UserA has visited 
* For each of these stores - see who the top 5 visitors are. 
* Select the store only if UserA is among the top 5 visitors. 

Les requêtes correspondantes seraient:

 
select store_id from shopping where user_id = xxx 
 
select user_id,count(*) as 'visits' from shopping 
where store_id in (select store_id from shopping where user_id = xxx) 
group by user_id 
order by visits desc 
limit 5 

Maintenant, j'ai besoin de vérifier dans ce resultset si UserA est présent et sélectionnez ce magasin seulement s'il est présent. Par exemple, s'il a visité un magasin 5 fois - mais s'il y a 5 personnes ou plus qui ont visité ce magasin plus de 5 fois - alors ce magasin ne devrait pas être sélectionné.

Donc, je suis un peu perdu ici.

Merci pour votre aide

Répondre

3

Cela devrait le faire. Il utilise une VUE intermédiaire pour déterminer combien de fois chaque utilisateur a magasiné dans chaque magasin. En outre, il suppose que vous avez une table de magasins quelque part avec chaque store_id listé une fois. Si ce n'est pas vrai, vous pouvez changer SELECT store_id FROM stores en SELECT DISTINCT store_id FROM shopping pour le même effet mais des résultats plus lents.

CREATE VIEW shop_results (store_id, user_id, purchase_count) AS 
    SELECT store_id, user_id, COUNT(*) 
    FROM shopping GROUP BY store_id, user_id 

SELECT store_id FROM stores 
    WHERE 'UserA' IN 
     (SELECT user_id FROM shop_results 
     WHERE shop_results.store_id = stores.store_id 
     ORDER BY purchase_count DESC LIMIT 5) 

Vous pouvez combiner en une seule requête en plaçant le SELECT de la vue dans la sous-requête, mais je pense qu'il est plus facile de lire cette façon et peut-être vrai que vous voulez que des informations agrégées ailleurs dans le système - plus cohérent pour le définir une fois dans une vue que de le répéter dans plusieurs requêtes.

+0

Merci Larry - J'ai la table des magasins, mais qui contient des informations uniquement sur le magasin, comme le nom de l'adresse, etc. Donc, je dois le changer à SELECT DISTINCT store_id FROM shopping. Aussi, si je veux combiner en une seule requête - est-ce que cela va ressembler:

 SELECT store_id FROM stores WHERE 'UserA' IN (SELECT store_id, user_id, COUNT(*) from shopping WHERE shopping.store_id = stores.store_id group by store_id, user_id ORDER BY purchase_count DESC LIMIT 5) 
Merci aussi – Gublooo

+0

Mysql lance une erreur en disant - Cette version de Mysql ne supporte pas Limiter en sous-requête - J'utilise Mysql version 5 – Gublooo

Questions connexes