3

在我的应用程序中,有发布者和类别。一个发布者可以属于多个类别。当我进行 mysql 事务时,它将为其所属的每个类别返回相同的发布者记录。这是查询:

选择
    grdirect_publisher.name,
    grdirect_publisher.short_description,
    grdirect_publisher.thumb_image,
    grdirect_publisher.url,
    grdirect_category.name 作为猫名
从
    grdirect_publisher
加入
    grdirect_publisher_categories
    在
    grdirect_publisher.id = grdirect_publisher_categories.publisher_id
加入
    grdirect_category
    在
    grdirect_publisher_categories.category_id = grdirect_category.id

返回:

名称 short_description thumb_image url 猫名
-------------------------------------------------- ----------
Foo Lorem Ipsum... images/pic.png d.com 视频游戏
Foo Lorem Ipsum... images/pic.png d.com 音乐
Bar Blah Blah... images/tic.png e.com 音乐

本质上,Foo 应该只在结果中出现一次。

4

1 回答 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;

因此,您必须决定您希望结果集如何获得正确的解决方案。

于 2008-11-07T23:11:50.163 回答