MySQL DANS l'opérateur


Http://pastebin.ca/1946913 Quand j'écris "DANS(1,2,4,5,6,7,8,9,10)" à l'intérieur de la procédure, j'obtiens le résultat correct, mais quand j'ajoute la variable id dans le "IN", les résultats sont incorrects. J'ai fait une fonction sur mysql mais sa ne fonctionne toujours pas, que puis-je faire?

Author: user455625, 2010-09-23

3 answers

Les chaînes (au sens large, les valeurs variables) ne s'interpolent pas dans les instructions. vKatID IN (id) vérifie si vKatID est égal à l'une des valeurs répertoriées, ce qui n'est qu'une: la valeur de id. Vous pouvez créer des requêtes dynamiques en utilisant PREPARE et EXECUTE pour interpoler des valeurs:

set @query = CONCAT('SELECT COUNT(*) AS toplam
                    FROM videolar
                    WHERE vTarih = CURDATE() AND vKatID IN (', id, ') AND vDurum = 1;') 
PREPARE bugun FROM @query;
EXECUTE bugun;
 1
Author: outis, 2010-09-22 23:18:31

Vous pouvez utiliser FIND_IN_SET () plutôt que DANS, par exemple:

SELECT COUNT(*) AS toplam
FROM videolar
WHERE vTarih = CURDATE()
AND FIND_IN_SET( vKatID, id ) > 0
AND vDurum = 1

Les ensembles ont des limites - ils ne peuvent pas avoir plus de 64 membres par exemple.

 2
Author: martin clayton, 2010-09-22 23:14:26

Vos variables id sont une chaîne (varchar) pas un tableau (tuple en SQL), c'est-à-dire que vous faites le ceci dans (en java)

String id = "1,2,3,4,5,6,7"

Vous voulez

int[] ids = {1,2,3,4,5,6,7}

, Donc dans votre code

set id = (1,2,3,4,5,6,7,8,9,10)

Je ne peux pas vous aider avec la syntaxe pour déclarer id car je ne sais pas. Je suggérerais de vous assurer que le code est facilement mis à jour de créer une table avec juste des identifiants, puis de modifier votre procédure stockée pour dire

SELECT COUNT(*) AS toplam
                        FROM videolar
                        WHERE vTarih = CURDATE() AND vKatID IN (SELECT DISTINCT id FROM idtable) AND vDurum = 1;

J'espère que cela aide.

 0
Author: Scott Warren, 2010-09-22 23:20:43