Te recomendamos que revises esta solución en un ambiente controlado antes de pasarlo a producción, saludos.
Solución:
Si tenemos una única columna (o conjunto de columnas) en la tabla, entonces podemos agregar otra expresión a la GROUP BY
.
La expresión debe devolver un valor único para cada fila cuando collection_id
es null. De lo contrario, devuelve una constante.
Suponiendo que tenemos un único id
columna en la tabla, entonces podemos hacer algo como esto:
... GROUP BY collection_id, IF(collection_id IS NULL, id, 0)
Esa segunda expresión en el GROUP BY
devuelve un valor constante 0
Cuándo collection_id
no es null. Pero devuelve un valor único para cada fila cuando collection_id es null.
Tenga en cuenta que id
aquí hay solo una referencia a una columna que se define como única dentro de la tabla. La CLAVE PRINCIPAL es un buen candidato. Si no tenemos un índice único en una sola columna, entonces podemos repetir este mismo tipo de expresión para cada columna en nuestra restricción única, o para cualquier conjunto de expresiones que se garantice que son únicas en cada fila.
... GROUP BY collection_id
, IF(collection_id IS NULL, col1, '')
, IF(collection_id IS NULL, col2, NULL)
, IF(collection_id IS NULL, col3, collection_id)
Alternativamente, podemos usar una expresión que genera un valor único:
... GROUP BY IFNULL(collection_id,UUID())
Prueba esto:
SELECT * FROM dc_deal
GROUP BY collection_id,
case WHEN collection_id IS NULL THEN ID ELSE 0 END
Reemplazar ID
con otra columna en la tabla para agrupar.
Ver un ejemplo en Violín SQL.