从MySQL查询中获取不同的记录

3
在我的应用程序中,有发布者和类别。一个发布者可以属于多个类别。当我进行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在结果中只应该出现一次。


如果您希望Foo只出现一次,您想看到哪个catname:视频游戏还是音乐? - Martin v. Löwis
无论如何都没关系。group_concat函数会将它们全部放在一个列中。 - damon
1个回答

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;

所以你需要决定结果集的展示方式,以获得正确的解决方案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接