$sql = "SELECT EXISTS (SELECT usernev AS juzernev, SUM(mbsent) AS summ FROM data WHERE datum > DATE_ADD(NOW(), INTERVAL -1 MONTH) AND usernev='csib')'";
我在这个表(数据)上有这个查询 - 第一个col。是usernev:
| sajtos | 1323 | 411 | 193.225.249.2 | 10.8.0.10 | 3661 | 2015-03-19 17:25:37 | 87 |
| csib | 318 | 26 | 5.187.169.135 | 10.8.0.6 | 10849 | 2015-03-19 19:11:37 | 88 |
| csib | 5 | 1 | 5.187.169.135 | 10.8.0.6 | 1234 | 2015-03-19 22:50:23 | 89 |
| gyuri | 26 | 31 | 193.225.249.2 | 10.8.0.14 | 3001 | 2015-03-19 22:56:54 | 90 |
所以问题是当我使用这个查询时它返回1 - >所以使用用户名csib的这个查询有很好的结果。但是当我将usernev更改为另一个(不存在)时,它也返回1。 我做错了什么或者我不能用EXISTS做这件事吗?
答案 0 :(得分:0)
原因是您正在使用聚合函数sum
,如果有任何数据,这将始终返回一行天气。
您可能需要删除exists
这是一个演示
mysql> select exists (select sum(amount) from paymentlog where idusers = 1 );
+----------------------------------------------------------------+
| exists (select sum(amount) from paymentlog where idusers = 1 ) |
+----------------------------------------------------------------+
| 1 |
+----------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select exists (select sum(amount) from paymentlog where idusers = 1111111111 );
+-------------------------------------------------------------------------+
| exists (select sum(amount) from paymentlog where idusers = 1111111111 ) |
+-------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> select exists (select * from paymentlog where idusers = 1111111111 );
+---------------------------------------------------------------+
| exists (select * from paymentlog where idusers = 1111111111 ) |
+---------------------------------------------------------------+
| 0 |
+---------------------------------------------------------------+
1 row in set (0.00 sec)
答案 1 :(得分:0)
没有group by
的聚合函数总是返回一行。并且,具有一行的查询满足exists
。
作为一般规则,我始终将select 1
与exists
一起使用。无需再选择任何内容:
SELECT EXISTS (SELECT 1
FROM data
WHERE datum > DATE_ADD(NOW(), INTERVAL -1 MONTH) AND
usernev = 'csib'
);
您也可以将此查询编写为:
SELECT COALESCE(MAX(1), 0)
FROM data
WHERE datum > DATE_ADD(NOW(), INTERVAL -1 MONTH) AND
usernev = 'csib';
索引在data(usernev, datum)
上,两者的表现可能相似。否则,第一个会有更好的表现。我只是提到这个版本,因为它有一个聚合函数,利用了一个没有group by
的聚合查询总是返回一行的事实。