MySQL запрос, где оператор IN - PullRequest
       14

MySQL запрос, где оператор IN

0 голосов
/ 23 августа 2010

Я хочу сделать следующее:

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);

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

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

Спасибо.

Ответы [ 4 ]

1 голос
/ 23 августа 2010

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. СЛЕВА ПРИСОЕДИНЯЙТЕСЬ к своей существующей таблице, чтобы увидеть, где 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 голосов
/ 04 июня 2013

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

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

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

0 голосов
/ 23 августа 2010

Вот предположение о том, что вы ищете:

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 голосов
/ 23 августа 2010

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

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

Редактировать: Я думаю, я знаю, что вы имеете в виду

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