J'ai une requête qui sélectionne une ligne/colonne spécifique d'une grande base de données. Disons que la valeur renvoyée est '53. 'Optimisation MYSQL SELECT (simple)
Je dois obtenir:
1. The row that is 3000 rows above this value.
2. The row that is 3000 rows below this value.
Si se révéler seulement 2000 lignes au-dessus de la valeur, alors je dois ajouter la différence sur la deuxième requête.
Ex.
1. Find 3000th value up (turns out that only 2000 values are present)
2. Find 4000th value down.
Voici comment je l'ai fait (ce qui est une procédure stockée):
SET @s1 = CONCAT('INSERT INTO List1(STD) SELECT t1.STD FROM ',t1,' AS t1 USE INDEX(STD) WHERE t1.STD < ',inp1,' order by STD DESC limit ', inp2);
PREPARE stmt FROM @s1;
EXECUTE stmt;
SET @lim = inp2+(inp2-(SELECT FOUND_ROWS()));
SET @s2 = CONCAT('INSERT INTO List1(STD) SELECT t1.STD FROM ',t1,' AS t1 USE INDEX(STD) WHERE t1.STD >=', inp1,' order by STD ASC limit ?');
PREPARE stmt FROM @s2;
EXECUTE stmt USING @lim;
SET @minSD1 = (SELECT MIN(STD) FROM List1);
SET @maxSD1 = (SELECT MAX(STD) FROM List1);
Cela semble terriblement rond-point ... est-il pas de meilleure façon?
De même, est-il vraiment impossible d'utiliser un nom de table de variables dans une procédure stockée sans créer une AUTRE procédure stockée (avec le mot-clé PREPARE
)?
Il manque beaucoup de contexte ici, comme la signification de toutes les variables mentionnées mais non définies. Sauf si vous fournissez beaucoup plus d'informations, votre question a très peu de sens. –
Ok - laissez-moi à la place me débarrasser des parties inutiles ... –
@Jim Est-ce que cela a plus de sens maintenant? –