12
votes

Query MySQL: Sélectionnez Top 3 rangées de la table pour chaque catégorie

J'ai une table avec des enregistrements et il a une ligne appelée catégorie code>. J'ai inséré trop d'articles et je ne veux sélectionner que deux articles de chaque catégorie.

J'ai essayé de faire quelque chose comme ceci: p>

J'ai créé une vue: p> xxx pré>

puis j'ai créé cette requête: p>

SELECT * 
FROM tbl_artikujt 
WHERE 
   artikullid IN
   (
      SELECT artikullid
      FROM limitrows
      ORDER BY category DESC
   )
ORDER BY category DESC;


2 commentaires

Lire cet article: Top N d'un groupe


Top N de groupe: thinoyes.com/littlenoise/?p=36


3 Réponses :


12
votes

limite n'arrête que le nombre de résultats que la déclaration revient. Ce que vous recherchez est généralement appelé fonctions analytique / fenêtrage / classement - que MySQL ne prend pas en charge, mais vous pouvez imiter à l'aide de variables: xxx

si vous ne changez pas Sélectionner x. * , l'ensemble de résultats inclura les valeurs Rank et VAR_CATATEGORY - Vous devrez spécifier les colonnes que vous voulez vraiment si ce n'est pas le cas.


4 commentaires

Fonctionne parfaitement, c'est ce dont j'avais besoin


Puis-je créer une vue d'une certaine manière à partir de cette sélection, j'ai essayé mais il est écrit: 1349 - La sélection de la vue contient une sous-requête dans la clause de FROM


@Axheladini: Désolé, MySQL ne le permettra pas de quelques raisons - la sous-requête, à l'aide de variables ... Les vues MySQL sont extrêmement restreintes, j'ai peur - ils répertorient les restrictions dans la documentation de la vue Create View: dev.mysql.com/doc/refman/5.1/fr/create-view.html


Pour moi, cela semble sélectionner comme top 3 de chaque catégorie comme s'il a été commandé sous forme de t.category asc, t.articleid asc mais comment le feriez-vous pour le sélectionner comme t.category ASC, T.ArticleID Desc ?



-5
votes

Utiliser le groupe par lieu de commande par.


0 commentaires

0
votes
SELECT * FROM (   
    SELECT  VD.`cat_id` ,  
       @cat_count := IF( (@cat_id = VD.`cat_id`), @cat_count + 1, 1 ) AS 'DUMMY1', 
       @cat_id := VD.`cat_id` AS 'DUMMY2',
       @cat_count AS 'CAT_COUNT'   
     FROM videos VD   
     INNER JOIN categories CT ON CT.`cat_id` = VD.`cat_id`  
       ,(SELECT @cat_count :=1, @cat_id :=-1) AS CID  
     ORDER BY VD.`cat_id` ASC ) AS `CAT_DETAILS`
     WHERE `CAT_COUNT` < 4

------- STEP FOLLOW ----------  
1 . select * from ( 'FILTER_DATA_HERE' ) WHERE 'COLUMN_COUNT_CONDITION_HERE' 
2.  'FILTER_DATA_HERE'   
    1. pass 2 variable @cat_count=1 and  @cat_id = -1  
    2.  If (@cat_id "match" column_cat_id value)  
        Then  @cat_count = @cat_count + 1    
        ELSE @cat_count = 1      
    3. SET @cat_id = column_cat_id    

 3. 'COLUMN_COUNT_CONDITION_HERE'   
    1. count_column < count_number    

4. ' EXTRA THING '
   1. If you want to execute more than one statement inside " if stmt "
   2. IF(condition, stmt1 , stmt2 )
      1. stmt1 :- CONCAT(exp1, exp2, exp3) 
      2. stmt2 :- CONCAT(exp1, exp2, exp3) 
   3. Final "If" Stmt LIKE 
      1. IF ( condition , CONCAT(exp1, exp2, exp3) , CONCAT(exp1, exp2, exp3) )    
share

0 commentaires