2017-06-22 5 views
1

Étant donné le nom de la catégorie, je suis en mesure de sélectionner le nombre d'entrées nécessaires. Par exemple - SELECT * FROM products WHERE Category = Taxi LIMIT 1, 2. Cela me donne parfaitement 2 entrées de catégorie = 'Taxi'.MySQL LIMIT sur plusieurs catégories

Maintenant, étant donné un tableau de noms de catégories, j'ai besoin d'effectuer une requête sql similaire, où je serai capable d'aller chercher le nombre requis d'entrées de chaque catégorie.

Condition - J'ai besoin de récupérer toutes les données de 2 (LIMIT 1, 2) rangées de chacune des catégories dans ['Taxi', 'Epicerie', 'Livraison',. . . . . . . . . . . ], en utilisant une seule requête SQL. C'est possible? Si oui, répondez s'il vous plaît.

J'ai essayé ceci - SELECT * FROM products WHERE Category IN ('Taxi', 'Groceries', 'Delivery', . . . . . . . . . . .) LIMIT 1, 2, mais il a donné le même résultat que ci-dessus.

Voici comment la table des produits ressemble -

+----------+----------+------+ 
| Category | Items | Count| 
+----------+----------+------+ 
| Taxi  | Sedan | 32 | 
| Delivery | Food  | 34 | 
| Delivery | Package | 42 | 
| Meals | Sandwitch| 29 | 
| Groceries| Butter | 36 | 
| Taxi  | SUV  | 39 | 
| Groceries| Milk  | 39 | 
+----------+----------+------+ 

O/P attendu -

+----------+----------+------+ 
| Category | Items | Count| 
+----------+----------+------+ 
| Taxi  | Sedan | 32 | 
| Delivery | Food  | 34 | 
| Delivery | Package | 42 | 
| Groceries| Butter | 36 | 
| Taxi  | SUV  | 39 | 
| Groceries| Milk  | 39 | 
+----------+----------+------+ 

lignes ordre n'a pas d'importance.

+1

Le moyen le plus simple d'y parvenir serait un UNION qui combine les résultats de plusieurs instructions SELECT individuelles. – CBroe

+1

@CBroe, mais cela ne ferait-il pas une mauvaise question? Dans le cas de, 100 éléments dans le tableau Catégorie, l'UNION ralentira considérablement le processus. –

+0

Qu'est-ce que vous essayez réellement de réaliser ici à la fin?Vous avez utilisé le mot "pagination" ici, mais jusqu'à présent, je ne vois pas grand chose à voir avec cela. La pagination n'a même pas beaucoup de sens, sauf si vous spécifiez une commande en premier. – CBroe

Répondre

0

Vous pouvez essayer -

SELECT p.category, p.items, p.count(*) num 
FROM product AS p 
WHERE (SELECT COUNT(*) FROM product AS p2 
     WHERE p2.category = p.category AND p2.items >= p.items) <= 2 
ORDER BY p.category ASC, p.items DESC 

Hope this helps.

+0

ce n'est pas standard SQL, vous ne pouvez pas vérifier que la sous-requête renvoie le résultat <= 2 –

+0

Cela compare plutôt que de vérifier .... –

0

group_concat pourrait être votre ami. Essayez cela: il affiche tous les éléments associés à une catégorie, les plus fréquents articles doivent apparaître en premier

select category, group_concat(items) from 
FROM product 
group by p.category; 

ou

select category, group_concat(items) from 
(SELECT p.category, p.items, p.count(*) as nb 
FROM product AS p 
group by p.category, p.items) as viewcats; 

limitée aux 2 premiers articles:

select category, SUBSTRING_INDEX(group_concat(items),',',2) from FROM product group by p.category; 
+0

Mais aucune de vos requêtes ne limitera la sortie à 2 lignes seulement. –

+0

vous pouvez supprimer le contenu après la deuxième virgule retournée par group_concat –

+0

sélectionnez la catégorie, SUBSTRING_INDEX (group_concat (items), ',', 2) à partir de FROM product group by p.category; –

0

Sans window functions cette deviendra vraiment moche. MySql ne supporte actuellement pas la fonction de fenêtre mais MariaDb. Pourquoi ne pas convertir à MariaDb qui rendra quelque chose comme ça plus facile. C'est un remplacement de MySql tant que vous n'utilisez pas de fonctionnalités Json ou quelque chose comme ça. La plupart des grandes entreprises comme google et wikipedia ont déjà fait le saut. Je voulais le vérifier. voici une exemple de requête que vous pouvez faire:

SELECT category, item, itemcount as count FROM 
(
    SELECT category, 
      item, 
      ROW_NUMBER() OVER (PARTITION BY category ORDER BY item) AS row_number, 
      COUNT(*) OVER (PARTITION BY category, item ORDER BY item) as itemcount 
    FROM products p 
) a 
WHERE a.row_number < 3 

Cette requête (non testé) dans MariaDB accomplira vos besoins.

0

noter que toute défaillance dans ce qui suit pour traiter correctement les détails de la question est que le reflet de la rareté inhérente à la question elle-même ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(Category VARCHAR(12) NOT NULL 
,Items VARCHAR(12) NOT NULL PRIMARY KEY 
,Count INT NOT NULL 
); 

INSERT INTO my_table VALUES 
('Taxi','Sedan',32), 
('Delivery' ,'Food'  ,34), 
('Delivery' ,'Package' ,42), 
('Meals' ,'Sandwitch',29), 
('Groceries','Butter' ,36), 
('Taxi'  ,'SUV'  ,39), 
('Groceries','Milk'  ,39); 

SELECT * 
    FROM my_table 
WHERE category IN ('taxi','groceries','delivery'); 
+-----------+---------+-------+ 
| Category | Items | Count | 
+-----------+---------+-------+ 
| Taxi  | Sedan | 32 | 
| Delivery | Food | 34 | 
| Delivery | Package | 42 | 
| Groceries | Butter | 36 | 
| Taxi  | SUV  | 39 | 
| Groceries | Milk | 39 | 
+-----------+---------+-------+ 
6 rows in set (0.01 sec) 

Pour une aide plus ciblée, voir: Why should I provide an MCVE for what seems to me to be a very simple SQL query?