2010-08-23 7 views
-2

Je veux faire ce qui suit:requête MySQL où dans l'instruction

SELECT count(id) FROM table WHERE value BETWEEN 3 AND 40; 

Mais il faut faire ce qui suit:

SELECT count(id) FROM table WHERE value IN(3, 4, 5, 6, 7, 8, 9, 10, 11, ..., 40); 

Il devrait même imprimer le nombre zéro (id) pour la valeur entre 3 et 40, mais pas value = x. Je veux vérifier si une valeur est dans une séquence (1, 2, 3, 4, ..., 50).

Est-ce que quelqu'un sait comment y parvenir avec mysql?

Merci.

+4

Il y a beaucoup de confusion dans cette question. – RedFilter

+1

Vous demandez au moins 3 questions différentes ici, que voulez-vous réellement faire? – nos

+0

Je veux obtenir un ensemble de résultats où COUNT (id) pour les valeurs de 3 à 40, même ceux où COUNT (id) pour value = x est zéro. – Vincent

Répondre

0

En supposant que je compris votre question:

SELECT count(id) FROM table WHERE value >= 3 AND value <= 40 AND value != 'x' 

Edit: Je pense que je sais ce que vous entendez

SELECT COALESCE(count(id),0) FROM table WHERE value BETWEEN 3 AND 40; 
+0

non! WHERE valeur = 3 OU valeur = 4 OU valeur = 5 OU ... Merci, de toute façon. – Vincent

+0

@Vincent: C'est logiquement équivalent, mais 'OR' peut être notoirement mauvais pour la performance ... –

+0

Je veux COUNT (id) s'il n'y a pas de valeur par ex. 35, donc je ne peux pas utiliser la valeur WHERE entre 3 et 40, car elle n'apparaîtra pas dans mon jeu de résultats. Comprenez-vous maintenant? Je veux avoir chaque COUNT (id) dans mon jeu de résultats pour des valeurs allant de 3 à 40 même celles où COUNT (id) = 0. – Vincent

0

Voici une estimation à ce que vous recherchez:

select c.Value, count(t.Value) as Count 
from (
    select 3 as Value 
    union all select 4 
    union all select 5 
    union all select 6 
    union all select 7 
    union all select 8 
    union all select 9 --add more as needed 
) c 
left outer join MyTable t on c.Value = t.Value 
group by c.Value 
+0

Je ne sais pas du tout ce que ça veut dire. Je veux vérifier si la valeur est égale à 3, 4, 5, 6, 7, ..., 40, mais pas entre 3 ou 40, égal à chaque nombre de 3 à 40. – Vincent

+0

@Vincent: voir ma mise à jour, juste extrapoler à partir du code si nécessaire. – RedFilter

1

MySQL n'a pas de fonctionnalité récursive, il vous reste donc à utiliser l'astuce de la table NUMBERS -

  1. Créer une table qui ne contient que le nombre incrémenter - facile à faire en utilisant un auto_increment:

    DROP TABLE IF EXISTS `example`.`numbers`; 
    CREATE TABLE `example`.`numbers` (
        `id` int(10) unsigned NOT NULL auto_increment, 
        PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=latin1; 
    
  2. Peupler la table en utilisant:

    INSERT INTO NUMBERS 
        (id) 
    VALUES 
        (NULL) 
    

    ... pour autant de valeurs que vous avez besoin.

  3. Ceci renvoie une liste des valeurs que vous voulez voir compte pour:

    SELECT n.id 
        FROM NUMBERS n 
    WHERE n.id BETWEEN 3 AND (? - 1) 
        OR n.id BETWEEN (? + 1) AND 40 
    
  4. LEFT JOIN sur votre table existante pour être en mesure de voir où le compte est nul:

    SELECT x.id AS value, 
         COALESCE(COUNT(y.id), 0) AS cnt 
        FROM (SELECT n.id 
          FROM NUMBERS n 
          WHERE n.id BETWEEN 3 AND (? - 1) 
           OR n.id BETWEEN (? + 1) AND 40) x 
    LEFT JOIN YOUR_TABLE yt ON yt.value = x.id 
    GROUP BY x.id 
    
0

Je pense que ce que vous cherchez est quelque chose comme:

SELECT value, count(id) FROM table 
WHERE value BETWEEN 3 AND 40 
GROUP BY value 

Mais cela ne vous donnera aucun compte (id) = 0 lignes pour les valeurs qui n'existent pas.