Вопрос

Alright, I have those columns on MySQL :

id
id_conv
associated_statut

The associated_statut is a number between 1 and 7.

What I want to do is to count only the id_conv if the LAST associated_statut for this id_conv is 2 for example.

Example :

-----------------------------------------------
|  id   |   id_conv   |   associated_statut   |
-----------------------------------------------
|  1    |      15     |          1            |
|  2    |      15     |          2            |
|  3    |      15     |          2            |
|  4    |      15     |          4            |
|  5    |      15     |          2            |
|  6    |      15     |          3            |

The id_conv would NOT be counted if I want the associated_statut = 2, because the last associated_statut for this id_conv is 3.

I already tried this query :

SELECT COUNT(DISTINCT id_conv) FROM MyTable WHERE associated_statut = 2

But this doesn't returns what I want.

Is there a way to do this in SQL ?

Thanks.

Это было полезно?

Решение

Maybe, this will work for you:

SELECT count(t1.id) FROM mytable t1
  INNER JOIN (SELECT id_conv, MAX(id) id FROM foo GROUP BY id_conv) t2
    ON t1.id = t2.id 
    WHERE t1.associated_statut = 2

Другие советы

SELECT COUNT(sub1.id_conv) FROM MyTable
INNER JOIN
(
SELECT DISTINCT id, FIRST(associated_statut ORDER BY id DESC)
group by id_conv
recent FROM MyTable
) sub1 ON sub1.id = MyTable.id
WHERE sub1.recent_associated_statut = 2

We can do same thing without sub query. It will take less time when you have more data.

SELECT count(t1.id) FROM 
mytable t1
  LEFT JOIN 
mytable t2
    ON t1.id_conv = t2.id_conv 
    AND t1.id < t2.id
WHERE t2.id IS NULL
AND t1.associated_statut = 2;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top