Actualmente estoy usando groupBy para agrupar concatenados (nombre del libro y autor del libro) . Estoy usando intencionalmente groupBy porque tengo otras columnas para obtener su promedio y suma .
Inicialmente usé este código a continuación. Pero me devuelve un error.
Illuminate\Database\QueryException: SQLSTATE[42000]: Error de sintaxis o infracción de acceso: 1055 La expresión n.º 1 de la lista SELECT no está en la cláusula GROUP BY y contiene
Reference::select('*') ->selectRaw("CONCAT(book_name, ' ', book_author) AS book") ->groupBy('type'); Si agrego una columna de id dentro de groupBy, no devuelve un error. Pero no ordena, sigo recibiendo el book duplicado.
Reference::select('*') ->selectRaw("CONCAT(book_name, ' ', book_author) AS book") ->groupBy(['id', 'type']);Alguien, ¿cómo lograr esto correctamente?
TLDR; Cuando usa group by en modo estricto, sus campos seleccionados deben ser campos agregados.
Digamos que tienes dos libros con el mismo tipo.
| nombre del libro | nombre del libro | escribe |
|---|---|---|
| Primero | autor | 1 |
| Segundo | editor | 1 |
Cuando agrupe por tipo, los que tengan el mismo tipo se fusionarán en uno. Entonces, ¿qué resultado será para CONCAT(book_name, ' ', book_author) ?
First author ?Second editor ?First editor ?Second author ? La consulta no se juega cuando el modo estricto está activo, debe agregar los campos, por ejemplo, LISTAGG(book_name , ',') es una agregación del campo book_name y da como resultado 'first,second' .
Si deshabilita el modo estricto ( 'strict' => false, ) en el archivo config/database.php , el resultado podría ser cualquiera de los 4 enumerados anteriormente, ya que es un poco aleatorio.
Otro ejemplo de funciones de agregación: SUM() , AVG() , COUNT() ...
Utilice el siguiente enlace, ya que la solución ya está disponible.
Comprueba y encontrarás la solución.