Получение различных записей из запроса MySQL - PullRequest
3 голосов
/ 08 ноября 2008

В моем приложении есть издатели и категории. Один издатель может принадлежать нескольким категориям. Когда я выполняю транзакцию mysql, она возвращает ту же запись издателя для каждой категории, к которой она относится. Вот запрос:

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

возвращается:

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

По сути, Foo должен появляться в результатах только один раз.

1 Ответ

4 голосов
/ 08 ноября 2008

Вы можете использовать DISTINCT, но если любой столбец в вашем наборе результатов имеет различное значение, это приводит к дублированию строки. Если вы хотите сократить список до одной строки на name, то вам нужно использовать DISTINCT, а столбец catname опустить:

SELECT DISTINCT
    grdirect_publisher.name,
    grdirect_publisher.short_description,
    grdirect_publisher.thumb_image,
    grdirect_publisher.url
FROM
. . .

Другим решением вместо использования DISTINCT является агрегатная функция MySQL GROUP_CONCAT(), которая позволяет принимать несколько значений в группе и создавать список через запятую:

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;

Таким образом, вы должны решить, как вы хотите, чтобы набор результатов выглядел, чтобы получить правильное решение.

...