2015-03-20 2 views
1
$sql = "SELECT EXISTS (SELECT usernev AS juzernev, SUM(mbsent) AS summ FROM data WHERE datum > DATE_ADD(NOW(), INTERVAL -1 MONTH) AND usernev='csib')'"; 

У меня есть этот запрос на эту таблицу (данные) - первый столбец. является usernev:SQL - если существует возврат всегда 1

| 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

Функция агрегации, не 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 всегда возвращает одну строку.

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) 
Смежные вопросы