【问题标题】:mysql: 0 instead of an empty tablemysql: 0 而不是空表
【发布时间】:2016-10-03 09:35:30
【问题描述】:

我有一个 sql 查询(简化示例):

select 
    ifnull(count(table.id), 0) as count 
from 
    table
where
    table.id > 10000

如果没有找到表中的任何内容,结果显示一个空表,但我想输出 0。

如何做到这一点?

我的决定(速度降低了 5 倍!!!)

DROP TEMPORARY TABLE IF EXISTS xxx;
CREATE TEMPORARY TABLE xxx ENGINE = MEMORY AS (SELECT SQL_CALC_FOUND_ROWS ...);

IF (FOUND_ROWS() = 0) THEN
    SELECT 0 AS count;
ELSE
    SELECT * FROM xxx;
END IF; 

它的工作!但缓慢:(

对不起,速度是恒定的 :) 我的错误

结果: 通过使用 SQL_CALC_FOUND_ROWS 和 FOUND_ROWS 解决了这个问题(感谢@Unknown User) 但是临时表...不确定这样的决定的最优性

【问题讨论】:

  • 您是否还有另一个表,其中所有table.ids 都存在?更好地根据一些示例输入向我们展示您的预期输出
  • 如果您尝试使用count(1) 而不是count(table.id) 会怎样?另外,我认为您不需要nullif
  • 养成接受答案的习惯(如果它适合你)。这是在 SO 中表达感谢的少数几种方式之一。
  • 您能否详细说明未找到的含义?例如,您是否希望找到介于 10000 和 10010 之间的 id,但又想查找是否缺少 10009?
  • 你为什么group by table.id?没有它会返回0

标签: mysql sql select where


【解决方案1】:

只需删除group by。另外,ifnull() 是不必要的:

select count(t.id) as `count`
from table t
where t.id > 10000;

您似乎想要满足条件的 id 计数。您的版本将为每个 id 返回一个单独的计数。

如果您想为每个 id 单独计数,您可以这样做:

select id, count(t.id) as `count`
from table t
where t.id > 10000
group by id 
union all
select null, 0
from table t
where not exists (select 1 from table t2 where t2.id > 10000);

【讨论】:

  • 对不起 - 'group by' 是我在示例中的错误(我检查了没有'group by' 的作品示例):)
  • @Zhihar 。 . .你是不正确的。如果没有 group by,则查询将返回一行,无论是否选择了任何行。
【解决方案2】:

您可以使用此查询。这将为您提供匹配查询的总记录数。如果没有匹配的结果,那么它会给你0

Reference

SELECT SQL_CALC_FOUND_ROWS ColumnName FROM TableName WHERE ColumnName IN ('');

SELECT FOUND_ROWS(); 

【讨论】:

  • 1000111, COALESCE not work 如果没有找到,则行数等于0,COALESCE 不起作用(空结果没有行,不是空结果有1行)
  • @Zhihar 你可以创建一个过程或者使用Prepare语句。
  • 临时表(在程序中)? stage1: 选择临时表 stage2: FOUND_ROWS stage3: 与0比较
  • ` IF (FOUND_ROWS() = 0) THEN SELECT 0 end IF;` @Unknown User - 它的工作
  • 我的决定(速度降低了 5 倍!!!) DROP TEMPORARY TABLE IF EXISTS xxx; CREATE TEMPORARY TABLE xxx ENGINE = MEMORY AS (...); IF (FOUND_ROWS() = 0) 然后选择 0 作为计数;其他选择 * 从 xxx;万一; 它的工作!但缓慢:(
【解决方案3】:

这边:

select 
    COALESCE(count(table.id), 0) as count 
from 
    table
where
    table.id > 10000
group by table.id

【讨论】:

    【解决方案4】:

    您可以在检查表中没有值时使用 case

     SELECT case when table.id is null then 0 
     else count(table.id) end as Count_NUM_ID FROM table
      where
     table.id > 10000
    

    【讨论】:

    • Zaynul Abadin Tuhin 不起作用,因为... 0 行返回 0.000 秒 / 0.000 秒
    • @Zhihar 您在 mysql 工作台中运行此 sql 代码的位置,它显示在操作输出“17:07:39 SELECT case when time is null then 0 else count(time) end as Count_NUM_ID FROM test1 1行返回 0.000 秒 / 0.000 秒 "
    猜你喜欢
    • 1970-01-01
    • 2018-04-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-18
    • 2013-10-13
    相关资源
    最近更新 更多