Obtener registros distintos de una consulta mysql
Pregunta
En mi aplicación, hay editores y categorías. Un editor puede pertenecer a varias categorías. Cuando realizo mi transacción mysql, devolverá el mismo registro de editor para cada categoría a la que pertenece. Aquí está la consulta:
SELECT grdirect_publisher.name, grdirect_publisher.short_description, grdirect_publisher.thumb_image, grdirect_publisher.url, grdirect_category.name AS catname FROM grdirect_publisher JOIN grdirect_publisher_categories ON grdirect_publisher.id = grdirect_publisher_categories.publisher_id JOIN grdirect_category ON grdirect_publisher_categories.category_id = grdirect_category.id
devuelve:
name short_description thumb_image url catname ------------------------------------------------------------ Foo Lorem Ipsum... images/pic.png d.com Video Games Foo Lorem Ipsum... images/pic.png d.com Music Bar Blah Blah... images/tic.png e.com Music
Esencialmente, Foo solo debería aparecer una vez en los resultados.
Solución
Puede usar DISTINCT
pero si la columna any en su conjunto de resultados tiene un valor distinto, obliga a la fila a duplicarse. Si desea reducir la lista a una fila por name
, entonces debe usar DISTINCT
y debe omitir la columna catname
:
SELECT DISTINCT
grdirect_publisher.name,
grdirect_publisher.short_description,
grdirect_publisher.thumb_image,
grdirect_publisher.url
FROM
. . .
Otra solución en lugar de usar DISTINCT
es la función agregada de MySQL GROUP_CONCAT ()
que le permite tomar múltiples valores en un grupo y producir una lista separada por comas:
SELECT
grdirect_publisher.name,
grdirect_publisher.short_description,
grdirect_publisher.thumb_image,
grdirect_publisher.url,
GROUP_CONCAT(grdirect_category.name) AS catname
. . .
GROUP BY grdirect_publisher.id;
Por lo tanto, debe decidir cómo desea que se vea el conjunto de resultados para obtener la solución correcta.