2008-11-07 116 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

回报:

从本质上讲,富应该只在结果中显示一次。

+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; 

所以,你必须决定如何你想结果集只看得到正确的解决方案。