Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SQL联接和计数返回意外匹配_Mysql_Sql - Fatal编程技术网

Mysql SQL联接和计数返回意外匹配

Mysql SQL联接和计数返回意外匹配,mysql,sql,Mysql,Sql,tbl1 type|price ---------- 1 | 10 2 | 15 tbl2 type|expires ---------- 1 | 2015-01-01 1 | 2017-01-01 1 | 2017-01-01 2 | 2015-01-01 2 | 2017-01-01 我想要一个查询,返回有关tbl1中给定类型的数据,以及tbl2中该类型的当前(未过期)记录数。我的问题是: select tbl1.*, count(if(

tbl1

 type|price
 ----------
 1   | 10
 2   | 15
tbl2

 type|expires
 ----------
 1   | 2015-01-01
 1   | 2017-01-01
 1   | 2017-01-01
 2   | 2015-01-01
 2   | 2017-01-01
我想要一个查询,返回有关
tbl1
中给定类型的数据,以及
tbl2
中该类型的当前(未过期)记录数。我的问题是:

select tbl1.*,
count(if(tbl2.expires > now(),1,null)) current
from tbl1 left join tbl2
on tbl1.type=tbl2.type
where tbl1.type = 1
正如预期的那样,它返回:

type|price|current
1   | 10  | 2
但是,当我请求一个不存在的类型时,我希望结果为0。但是,如果将查询中的类型替换为
3
,则会得到:

type|price|current
NULL|NULL | 0
请帮我理解

  • 该记录如何与查询匹配?(我期望结果集为空)
  • 如何获得我期望的行为?(即不存在的
    类型
    没有结果)

  • 使用聚合函数,如
    count
    而不使用
    group by
    子句,将始终只返回一行

    解决方法是将查询包装在子查询中,并在外部查询中再次检查
    类型

    select *
    from (
       select tbl1.*,
              count(if(tbl2.expires > now(),1,null)) current
       from tbl1 
       left join tbl2 on tbl1.type=tbl2.type
       where tbl1.type = 3) as t
    where type = 3   
    

    使用聚合函数,如
    count
    而不使用
    group by
    子句,将始终只返回一行

    解决方法是将查询包装在子查询中,并在外部查询中再次检查
    类型

    select *
    from (
       select tbl1.*,
              count(if(tbl2.expires > now(),1,null)) current
       from tbl1 
       left join tbl2 on tbl1.type=tbl2.type
       where tbl1.type = 3) as t
    where type = 3   
    

    您应该注意,所有聚合查询将返回至少一行作为结果

    看看这个例子

    SELECT 1
    where 1=0;
    
    上面返回的结果为空。但是下面

    SELECT SUM(1)
    where 1=0;
    

    以单行形式返回NULL

    您应该注意,所有聚合查询将至少返回一行作为结果

    看看这个例子

    SELECT 1
    where 1=0;
    
    上面返回的结果为空。但是下面

    SELECT SUM(1)
    where 1=0;
    
    以单行形式返回NULL

    我将尝试以下方法:

    select type , count(counter) from (
    select tbl1.type type,tbl2.expires counter
      from tbl1 left join tbl2
        on tbl1.type=tbl2.type
     where tbl1.type = 1
       and tbl2.expires > now()
    ) t
     group by type   ;
    
    不同之处在于,在查询中,当没有匹配的数据时,仍然返回一些内容(
    if(tbl2.expires>now(),1,null)
    )。

    我会尝试以下方法:

    select type , count(counter) from (
    select tbl1.type type,tbl2.expires counter
      from tbl1 left join tbl2
        on tbl1.type=tbl2.type
     where tbl1.type = 1
       and tbl2.expires > now()
    ) t
     group by type   ;
    
    不同之处在于,在查询中,当没有匹配的数据时,仍然返回某些内容(
    if(tbl2.expires>now(),1,null)
    )。

    尝试此查询:

    SELECT 
        tbl1.type
        ,tbl1.price
        ,count(A.expires) 
    FROM tbl1 
    INNER JOIN 
    (
        SELECT 
             tbl2.type
             ,tbl2.expires
        FROM tbl2
        WHERE tbl2.expires > now()
    ) AS A
    ON tbl1.type = A.type
    WHERE tbl1.type = 3
    GROUP BY tbl1.type
    
    编辑 仅供参考:尽管上面的查询可以工作,但与SQL Server或其他SQL产品不兼容,因此无法工作

    下面的查询将与任何支持内部联接和日期函数的SQL产品一起使用,以获取当前日期。唯一需要做的更改是在目标sql产品中用类似的函数替换Now()

    MySql在某些方面似乎很贫乏

    SELECT 
        tbl1.Type
        ,tbl1.Price
        ,A.ExpCount
    FROM tbl1 
    INNER JOIN 
    (
        SELECT 
            tbl2.Type
            ,COUNT(tbl2.Expires) ExpCount
        FROM tbl2
        WHERE tbl2.expires > NOW()
        GROUP BY tbl2.Type
    ) AS A
    ON tbl1.type = A.type
    WHERE tbl1.type = 1
    
    请尝试以下查询:

    SELECT 
        tbl1.type
        ,tbl1.price
        ,count(A.expires) 
    FROM tbl1 
    INNER JOIN 
    (
        SELECT 
             tbl2.type
             ,tbl2.expires
        FROM tbl2
        WHERE tbl2.expires > now()
    ) AS A
    ON tbl1.type = A.type
    WHERE tbl1.type = 3
    GROUP BY tbl1.type
    
    编辑 仅供参考:尽管上面的查询可以工作,但与SQL Server或其他SQL产品不兼容,因此无法工作

    下面的查询将与任何支持内部联接和日期函数的SQL产品一起使用,以获取当前日期。唯一需要做的更改是在目标sql产品中用类似的函数替换Now()

    MySql在某些方面似乎很贫乏

    SELECT 
        tbl1.Type
        ,tbl1.Price
        ,A.ExpCount
    FROM tbl1 
    INNER JOIN 
    (
        SELECT 
            tbl2.Type
            ,COUNT(tbl2.Expires) ExpCount
        FROM tbl2
        WHERE tbl2.expires > NOW()
        GROUP BY tbl2.Type
    ) AS A
    ON tbl1.type = A.type
    WHERE tbl1.type = 1
    

    谢谢你的回复。首先从Giorgos那里了解到聚合函数时不使用
    groupby
    总是返回一些东西,然后我添加了
    groupby
    子句。以下是我选择的查询:

    select tbl1.*, count(*) current
    from tbl1 left join tbl2
    on tbl1.type=tbl2.type
    where tbl1.type=3 and tbl2.expires > now()
    group by tbl1.type
    

    谢谢大家。

    谢谢你们的回复。首先从Giorgos那里了解到聚合函数时不使用
    groupby
    总是返回一些东西,然后我添加了
    groupby
    子句。以下是我选择的查询:

    select tbl1.*, count(*) current
    from tbl1 left join tbl2
    on tbl1.type=tbl2.type
    where tbl1.type=3 and tbl2.expires > now()
    group by tbl1.type
    
    SELECT T.* , (SELECT COUNT(*) FROM TBL2 WHERE TYPE = T.TYPE AND EXPIRES >= SYSDATE )  current
     FROM TBL1 T
    WHERE T.TYPE = 1 ;
    
    /* IF TBL2.EXPIRES DATA TYPE IS NOT DATE AT FIRST YOU SHOULD MAKE IT DATE *\ 
    

    谢谢大家。

    您的
    tbl1
    表中没有3的
    类型
    的任何数据,因此它无法显示在结果集中。如果您想显示3,您需要从其他地方引入此数据。Hi@TimBiegeleisen。我没想到会在结果中看到
    类型3
    。我希望在搜索类型
    3
    时有0个结果,但返回1个结果。这是我没有得到的。使用一个聚合函数,如<代码>计数>代码>没有<代码>组> <代码>子句总是返回一行。并且考虑这个输出模式<代码> NULL空值0 < /代码>作为<代码> 0行发现< /代码> @谢谢1000111。是的,从使用输出的PHP端很容易做到这一点;虽然(在OP中)您的
    tbl1
    表中没有3的
    type
    的任何数据,但它没有回答我提出的两个问题中的任何一个,因此它无法出现在结果集中。如果您想显示3,您需要从其他地方引入此数据。Hi@TimBiegeleisen。我没想到会在结果中看到
    类型3
    。我希望在搜索类型
    3
    时有0个结果,但返回1个结果。这是我没有得到的。使用一个聚合函数,如<代码>计数>代码>没有<代码>组> <代码>子句总是返回一行。并且考虑这个输出模式<代码> NULL空值0 < /代码>作为<代码> 0行发现< /代码> @谢谢1000111。是的,从使用输出的PHP端很容易做到这一点;它没有回答我的两个问题(来自OP)Hi Giorgos。这就是我在等待答案时得到的结果(除了我认为您的内部和外部
    类型
    值应该是相同的;现在您的
    1
    3
    不匹配)。这对我来说似乎很笨拙,但也许这是最简单的选择。嗨,乔治。这就是我在等待答案时得到的结果(除了我认为您的内部和外部
    类型
    值应该是相同的;现在您的
    1
    3
    不匹配)。这对我来说似乎很笨拙,但也许这是最简单的选择。谢谢。这是可行的(向上投票),但它比我推导的解决方案更复杂。它也没有解释我的OP结果如何与我的查询匹配(这是我的第一个问题),谢谢你投票支持这个解决方案。谢谢你的替代查询。我很难理解其中的操作顺序。
    内部连接首先构建一个表,然后我们从右上角的表中选择
    ?但是最后一行是内部查询的一部分吗?更多的括号或缩进可能会有所帮助。谢谢你的时间,你说得对
    
    SELECT T.* , (SELECT COUNT(*) FROM TBL2 WHERE TYPE = T.TYPE AND EXPIRES >= SYSDATE )  current
     FROM TBL1 T
    WHERE T.TYPE = 1 ;
    
    /* IF TBL2.EXPIRES DATA TYPE IS NOT DATE AT FIRST YOU SHOULD MAKE IT DATE *\