2010-08-23 5 views
-2

я хочу сделать следующее:MySQL запросов где В заявлении

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

Но это необходимо сделать следующее:

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

Он должен даже распечатать нулевой отсчет (ИН) для значения между 3 и 40, но не значение = x. Я хочу проверить, находится ли значение в последовательности (1, 2, 3, 4, ..., 50).

Кто-нибудь знает, как достичь этого с помощью mysql?

Спасибо.

+4

В этом вопросе много путаницы. – RedFilter

+1

Вы задаете здесь 3 разных вопроса, что вы на самом деле хотите сделать? – nos

+0

Я хочу получить набор результатов, где COUNT (id) для значений от 3 до 40, даже тех, где COUNT (id) для значения = x равно нулю. – Vincent

ответ

0

Предполагая, что я понял ваш вопрос:

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

Edit: Я думаю, я знаю, что вы имеете в виду

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

нет! WHERE value = 3 OR value = 4 OR value = 5 OR ... Спасибо, в любом случае. – Vincent

+0

@ Vincent: Это логически эквивалентно, но 'OR' может быть заведомо плохим для производительности ... –

+0

Я хочу COUNT (id), если нет значения, например. 35, поэтому я не могу использовать значение WHERE BETWEEN 3 И 40, потому что оно не появится в моем результирующем наборе. Вы теперь понимаете? Я хочу иметь каждый COUNT (id) в моем результирующем наборе для значений от 3 до 40, даже если COUNT (id) = 0. – Vincent

0

Вот догадка на то, что вы ищете:

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

Я не знаю, что это значит. Я хочу проверить, равно ли значение 3, 4, 5, 6, 7, ..., 40, но не между 3 или 40, равное каждому числу от 3 до 40. – Vincent

+0

@Vincent: см. Мое обновление, просто экстраполируйте из кода по мере необходимости. – RedFilter

1

MySQL не имеет рекурсивной функциональности, поэтому вы остаетесь использовать трюк таблицы NUMBERS -

  1. Создать таблицу, которая содержит только увеличивающееся значение - легко сделать с помощью 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. Заполните таблицу, используя:

    INSERT INTO NUMBERS 
        (id) 
    VALUES 
        (NULL) 
    

    ... столько ценностей, как тебе нужно.

  3. Это возвращает список значений, которые вы хотите видеть счетчики для:

    SELECT n.id 
        FROM NUMBERS n 
    WHERE n.id BETWEEN 3 AND (? - 1) 
        OR n.id BETWEEN (? + 1) AND 40 
    
  4. LEFT JOIN на существующую таблицу, чтобы иметь возможность видеть, где COUNT равен нулю:

    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

Я думаю, что вы ищете что-то вроде:

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

Но это не даст вам никакого счета (id) = 0 строк для значений, которые не существуют.

 Смежные вопросы

  • Нет связанных вопросов^_^