2013-06-12 2 views
0

J'essaie d'obtenir la moitié supérieure des entrées dont le champ est égal à 1. Je drapeau essayé d'utiliser une variable pour maintenir la valeur limite dansrequête SQL - limite basée sur la sous-requête

set @v1:=(select ceil(count(*)/2) as top_half from my_table 
where flagged=1); 

select * from my_table where flagged=1 order by 21_day_probability limit @v1; 

Mais cela ne travail. Aucune suggestion?

Merci

Répondre

1

Comme documenté sous SELECT Syntaxe:

La clause LIMIT peut être utilisé pour limiter le nombre de lignes renvoyées par l'instruction SELECT. LIMIT prend un ou deux arguments numériques, qui doivent tous deux être des constantes entières non négatives, avec ces exceptions:

  • Dans les instructions préparées, LIMIT paramètres peuvent être spécifiés à l'aide de marqueurs ? espace réservé.

  • Dans les programmes stockés, les paramètres LIMIT peuvent être spécifiés à l'aide de paramètres de routine de valeur entière ou de variables locales.

Par conséquent LIMIT paramètres ne peuvent jamais être user-defined variables. Vos options, comme indiqué ci-dessus, sont à utiliser:

  1. déclarations préparées

    PREPARE stmt FROM ' 
        select * from my_table where flagged=1 order by 21_day_probability limit ? 
    '; 
    EXECUTE stmt USING @v1; 
    DEALLOCATE PREPARE stmt; 
    
  2. un paramètre/variable locale à un programme stocké:

    CREATE PROCEDURE foo(_l INT) 
        select * from my_table where flagged=1 order by 21_day_probability limit _l 
    ; 
    CALL foo(@v1); 
    
+0

Merci très bien – user1893354

+0

OK maintenant j'ai besoin d'un moyen de le faire sans déclarer une variable. Est-ce possible? – user1893354

+0

@ user1893354: Comment voulez-vous dire? En utilisant la deuxième méthode ci-dessus, on pourrait 'CALL foo (123);'. – eggyal

Questions connexes