2008-11-07 3 views
3

В моем приложении есть издатели и категории. Один издатель может принадлежать нескольким категориям. Когда я делаю транзакцию mysql, он вернет тот же рекорд издателя для каждой категории, к которой он принадлежит. Вот запрос:Получение различных записей из запроса 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

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

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

+0

Если вы хотите, чтобы Foo появлялся только один раз, какое имя вы хотите увидеть: видеоигры или музыка? – 2008-11-08 08:31:08

ответ

4

Вы можете использовать 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; 

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

Смежные вопросы