MySQL GROUP en una columna basada en otra columna pero también excluye duplicados basados en la segunda columna

bits

Tengo esta base de datos

+----+-------+--------+-------------+---------------------+------------+---------+
| id | jobid | status | worker      | addedTime           | jobType    | sceneId |
+----+-------+--------+-------------+---------------------+------------+---------+
| 56 | TEST1 |      2 | na          | 2020-02-07 13:19:28 | PROC_STD   | 123test |
| 57 | TEST2 |      2 | na          | 2020-02-07 13:19:29 | PROC_STD   | 123test |
| 58 | TEST3 |     -1 | na          | 2020-02-08 06:45:25 | PROC_STD   | 124test |
| 59 | TEST4 |     -1 | na          | 2020-02-08 06:45:25 | PROC_STD   | 124test |
| 60 | TEST5 |      2 | na          | 2020-02-08 06:55:24 | PROC_STD   | 124test |
| 61 | TEST6 |      2 | na          | 2020-02-08 06:55:25 | PROC_STD   | 124test |
+----+-------+--------+-------------+---------------------+------------+---------+

Utilizando

SELECT sceneId, COUNT(*) FROM jobqueue WHERE status=2 GROUP BY sceneId, status HAVING COUNT(*) > 1;

Puedo agrupar la ID de la escena para obtener esto

+---------+----------+
| sceneId | COUNT(*) |
+---------+----------+
| 123test |        2 |
| 124test |        2 |
+---------+----------+

Pero solo estoy interesado en sceneId 123test ya que todas las filas tienen el estado 2, mientras que 124test tiene tanto el estado 2 como el -1.

¡Cambiando la consulta como este estado! = 2 Al menos puedo obtener el ID de escena que no quiero

SELECT sceneId, COUNT(*) FROM jobqueue WHERE status!=2 GROUP BY sceneId, status HAVING COUNT(*) > 1;

para conseguir esto

+---------+----------+
| sceneId | COUNT(*) |
+---------+----------+
| 124test |        2 |
+---------+----------+

¿Se puede filtrar mi primera consulta por la segunda consulta de negación o hay otros trucos inteligentes para hacer esto i sql?

Para mayor claridad, quiero cambiar mi consulta para obtener solo sceneIds (podría ser más de uno, pero en mi ejemplo solo hay un resultado válido que quiero) que solo tenga el estado 2, ¿este es el resultado que quiero?

+---------+----------+
| sceneId | COUNT(*) |
+---------+----------+
| 123test |        2 |
+---------+----------+

Estoy usando mysql Ver 14.14 Distrib 5.7.28, para Linux (x86_64) usando el contenedor EditLine en Ubuntu 16.04

GMB

El problema es que, al poner una condición statusen la wherecláusula, eliminas filas antes de tener la oportunidad de comprobar su contenido. En su lugar, puede filtrar con otra havingcondición que realice agregación condicional:

select sceneid, count(*) 
from jobqueue 
group by sceneid 
having count(*) > 1 and min(status = 2) = 1

Esto le da la lista de sceneidcorreos electrónicos que ocurren más de una vez y cuyas filas tienen status = 2.

Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.

En caso de infracción, por favor [email protected] Eliminar

Editado en
0

Déjame decir algunas palabras

0Comentarios
Iniciar sesiónRevisión de participación posterior

Artículos relacionados

TOP Lista

CalienteEtiquetas

Archivo