Mysql SQL联接和计数返回意外匹配
tbl1Mysql 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(
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 *\