mysql查询where IN语句

Posted

技术标签:

【中文标题】mysql查询where IN语句【英文标题】:mysql query where IN statement 【发布时间】:2010-08-23 18:04:37 【问题描述】:

我想做以下事情:

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 之间的值打印零计数(id),但不是 value = x。我想检查一个值是否在一个序列中(1、2、3、4、...、50)。

有谁知道如何用 mysql 实现这一点?

谢谢。

【问题讨论】:

这个问题有很多困惑。 你在这里问了至少 3 个不同的问题,你到底想做什么? 我想得到一个结果集,其中 COUNT(id) 的值从 3 到 40,即使是那些 value=x 的 COUNT(id) 为零的结果集。 【参考方案1】:

MySQL 没有递归功能,因此您只能使用 NUMBERS 表技巧 -

    创建一个只包含递增数字的表 - 使用 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;
    

    使用以下方法填充表:

    INSERT INTO NUMBERS
      (id)
    VALUES
      (NULL)
    

    ...为你需要的尽可能多的值。

    这将返回您想要查看的值的列表:

    SELECT n.id
      FROM NUMBERS n
     WHERE n.id BETWEEN 3 AND (? - 1)
        OR n.id BETWEEN (? + 1) AND 40
    

    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
    

【讨论】:

【参考方案2】:

以下是您要查找的内容的猜测:

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

【讨论】:

我完全不知道这是什么意思。我想检查值是否等于 3、4、5、6、7、...、40,但不在 3 或 40 之间,等于从 3 到 40 的每个数字。 @Vincent:查看我的更新,根据需要从代码中推断。【参考方案3】:

假设我理解你的问题:

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;

【讨论】:

不! WHERE value = 3 OR value = 4 OR value = 5 OR ...谢谢,无论如何。 @Vincent:这在逻辑上是等价的,但 OR 对性能的影响是出了名的…… 如果没有值,我想 COUNT(id) 例如35,所以我不能使用 WHERE 值 BETWEEN 3 AND 40,因为它不会出现在我的结果集中。你现在明白了吗?我希望结果集中的每个 COUNT(id) 的值都在 3 到 40 之间,即使是 COUNT(id)=0 的值。【参考方案4】:

我认为您正在寻找的内容类似于:

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

但是对于不存在的值,这不会为您提供任何 count(id) = 0 行。

【讨论】:

以上是关于mysql查询where IN语句的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询语句提示Unknown column 'zp' in 'where clause',求解!

7_mysql查询之where子句

MySQL 查询语句SELECT和数据条件过滤

MySQL查询语句

mysql百万数据查询 用啥代替in,该如何处理

Mysql的查询