【问题标题】:MySQL: how to get result from 2 tables without repeating results?MySQL:如何从 2 个表中获取结果而不重复结果?
【发布时间】:2013-12-06 18:17:18
【问题描述】:

我有 3 个表:book、publisher、book_category

对于特定的书籍类别(奇幻),我必须显示提供该类型的出版商名称列表。

publisher_name 和 category_name 是通过 book 表链接的,所以我的查询是:

SELECT publisher.publisher_name
FROM publisher, book, book_category
WHERE publisher.publisher_id = book.publisher_id
AND book.category_id = book_category.category_id
AND category_name =  'fantasy';

但如果该出版商提供的奇幻书籍不止一本,我得到的结果是重复出版商的名称。

假设我有《霍比特人》和《指环王》,它们都是奇幻作品,由同一个 PublisherA 提供。 在这种情况下,我的查询结果是:

PublisherA

PublisherA

是否有可能只获得一次该结果?即使有不止两本奇幻书 由同一出版商出版?

【问题讨论】:

标签: mysql


【解决方案1】:

如果您只需要 publisher_name,请使用 distinct

SELECT distinct publisher.publisher_name

顺便说一下,尝试使用JOIN语法...加入表格

SELECT distinct p.publisher_name
FROM publisher p
join book b on b.publisher_id = p.publisher_id
join book_Category bc on bc.category_id = b.category_id
where bc.category_name = 'fantasy'

【讨论】:

    【解决方案2】:

    使用DISTINCT

    SELECT DISTINCT publisher.publisher_name
    FROM publisher, book, book_category
    WHERE publisher.publisher_id = book.publisher_id
    AND book.category_id = book_category.category_id
    AND category_name = 'fantasy';
    

    【讨论】:

      【解决方案3】:

      尝试将其添加到查询的末尾:GROUP BY publisher.publisher_name

      【讨论】:

        【解决方案4】:

        每个人都提到 DISTINCT,这是正确的 (better than GROUP BY in MySQL, because of the way the optimizer is set up),但我想我也会添加一个修改以增强性能。

        目前您有隐式交叉连接来访问其他表,并且由于过滤顺序,使这些显式INNER JOINs 将提高效率。示例:

        SELECT DISTINCT Publisher.publisher_name
        FROM publisher Publisher
        INNER JOIN book Book ON Publisher.publisher_id = Book.publisher_id
        INNER JOIN book_category Book_Category ON Book.category_id = Book_Category.category_id
        WHERE Book_Category.category_name = 'fantasy';
        

        在原始查询中,您引入所有三个表的完整记录集(publisherbookbook_category),然后从该集合中加入相应的键,然后返回结果放。在这个新查询中,您对 Book_Category 的联接仅基于从 Publisher 和 Book 之间的联接返回的记录集。如果基于此联接发生过滤,您将看到性能提升。

        您还拥有符合 ANSI 标准以及显式编码以提高维护便利性的额外好处。

        【讨论】:

        • 只是一个问题,为什么要添加与表名称完全相同的别名?
        • @RaphaëlAlthaus - 不准确;我将它们大写,表示别名和表格之间的区别。并回答您的问题,它的编码偏好;在使用多个连接和大量字段/逻辑创建更大的视图时,使用像 b 这样的简单字符会为 QAs 测试和后期增强开发人员消化更多的工作。这种方式非常透明,但对性能没有影响。
        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 2017-04-25
        • 1970-01-01
        • 2015-05-24
        • 1970-01-01
        • 2019-09-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多