2011-09-26 2 views
0

que je dois obtenir un jeu d'enregistrements où je remplis le niveau 1 sur le terrain pour tous les 60 dossiers, cela signifie que je dois remplir le terrain niveau1 ainsi:compteurs de position MySQL sous dans Query

  • sur pos = 1 et pos = 60 avec level1 = 1
  • sur pos = 61 et pos = 120 avec level1 = 2
  • sur pos = 121 et pos = 180 avec level1 = 3

... puis: si j'ai laissé ' disons 630 enregistrements que je dois définir pour pos = 601 et 630 level1 = 10 parce que je n'ai pas 660 enregistrements, le 630ème record a fini le niveau.

Est-ce que quelqu'un a une idée de comment cela peut être fait de manière propre?

SET @pos:=0; 
SET @posrel:=0; 
SET @level1:=0; 
SELECT id, member_id, member_name, pos, @posrel:[email protected]+1 AS posrel, @level1:[email protected]+??? AS level1 
FROM 
(
    SELECT id, member_id, LEFT(member_name, LENGTH(member_name)-36) AS member_name, @pos:[email protected]+1 AS pos FROM member_directory WHERE member_name_first= 'A' 
) AS directory_listing 
HAVING pos % 60 IN(0,1); 
+0

Ce n'est pas pour la pagination, non? Parce que si c'est le cas, vous le faites mal. –

+0

@Adrian: non, il est utilisé pour une liste de répertoires (seo). Il y a plus de 100m enregistrements et besoin de les diviser en plusieurs niveaux pour la liste – nenad007

Répondre

1
-- SET @pos:=0; //Can be moved inside the query. 
-- SET @posrel:=0; 
SELECT inner.*, posrel DIV 60 as level1 FROM (
    SELECT directory_listing.*, @posrel:[email protected]+1 AS posrel AS level1 
    FROM 
    (
    SELECT 
     id 
     , member_id 
     , LEFT(member_name, LENGTH(member_name)-36) AS member_name_first 
     , @pos:[email protected]+1 AS pos 
    FROM member_directory 
    CROSS JOIN (SELECT @pos:= 0) x1 
    WHERE member_name_first = 'A' 
    AND directory_listing.pos < 120 
) directory_listing 
    CROSS JOIN (SELECT @posrel:= 0) x2 
) inner 

Ou peut-être

-- SET @pos:=0; //Can be moved inside the query. 
-- SET @posrel:=0; 
SELECT inner.*, posrel DIV 60 as level1 FROM (
    SELECT directory_listing.*, @posrel:[email protected]+1 AS posrel AS level1 
    FROM 
    (
    SELECT 
     id 
     , member_id 
     , LEFT(member_name, 1) AS member_name_first 
     , @pos:[email protected]+1 AS pos 
    FROM member_directory 
    CROSS JOIN (SELECT @pos:= 0) x1 
    WHERE member_name LIKE 'A%' 
    AND directory_listing.pos < 120 
) directory_listing 
    CROSS JOIN (SELECT @posrel:= 0) x2 
) inner 
+0

Il regarde très bien, je vais le tester dans les 30 prochaines minutes (le serveur est occupé en ce moment) et vous faire savoir – nenad007

+0

deux échecs de requête .. .pour la bonne syntaxe à utiliser près de 'interne. *, posrel DIV 60 comme niveau1 FROM ( SELECT répertoire_listing. *, @posrel: = @' à la ligne 1 toute idée? – nenad007

+0

J'ai corrigé la requête, mais il ne livre pas ce dont il a besoin, le champ pos n'est plus correct, le recordset n'est que de 60 enregistrements et le niveau est rempli pour chaque ligne. – nenad007