Insertar «GROUP BY» en las claúsulas SQL de Views 3 de Drupal

El módulo Views de Drupal es una de las herramientas más potentes a la hora de generar listados personalizados de contenidos de nuestra web. Las consultas se crean y personalizan a través del panel de administración de Views, de forma visual, lo cual tiene dos consecuencias: es muy cómodo y fácil cambiar parámetros y argumentos de las queries, pero , por contra, esto a veces redunda en que el código generado no es exactamente la consulta SQL que deseamos.

Esto se puede dar en distintos casos en los que queremos agrupar por alguno de los campos de nuestro contenido, pero las opciones de «Distinct» y «agrupar resultados» de Views son insuficientes. Es un caso común la necesidad de agrupar eventos en función de su NID, independientemente de sus campos de fecha (por ejemplo, al utilizar fechas repetitivas con Date).

Para poder añadir a nuestra elección una claúsula «group by» en nuestra query existe un «apaño» que funciona a la perfección, solventando esta necesidad. Se basa en implementar un módulo personalizado con un hook que modifique la query SQL de Views, reemplazando un comentario propio por el group by correspondiente.

Los pasos son los siguientes:

  1. Añadir un comentario a nuestra query SQL a través de: opciones avanzadas > opciones de consulta > y ahí introduciremos algo como «groupby:campoaagrupar» en el campo «comentario». «Campoaagrupar» deberá reemplazarse por el nombre del campo de la query SQL por el que queremos agrupar en nuestro groupby.
  2. Creación de un módulo personalizado, ubicado en «sites/all/modules/nombremodulo/nombremodulo.module» (creando asimismo el fichero nombremodulo.info)
  3. En nuestro módulo utilizaremos el hook «nombremodulo_query_alter»:
    function dupevents_query_alter(QueryAlterableInterface $query) {
    
      if ($query->hasTag('views')) {
    
        static $count;
        $view =& $query->getMetaData('view');
    
        if (strstr($groupby = $view->query->options['query_comment'], 'groupby')) {
    
          list($action, $field) = explode(':', $groupby);
    
          if (strlen($field) > 0) {
            $query->groupBy($field);
          }
        }
      }
    }

Esto lo que hará será interceptar cada una de las queries SQL de nuestro Drupal, modificando aquellas que sean realizadas por «Views». Dentro de las queries de Views, modificará aquellas que tengan «groupby» en sus comentarios, reemplazando lo que pongamos tras el «groupby:» para agregarlo a la query SQL como argumentos.

Referencia | Código en Dropbucket, por Patrick Thurmond.
Software utilizado | Drupal 7.22, Views 3.7.