SQL - 如果存在则返回1

时间:2015-03-20 09:17:18

标签: php mysql

$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做这件事吗?

2 个答案:

答案 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 1exists一起使用。无需再选择任何内容:

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的聚合查询总是返回一行的事实。