【问题标题】:SQL many to many selectSQL多对多选择
【发布时间】:2011-03-30 00:51:32
【问题描述】:
category_product
---------------
id_category
id_product

product
---------------
id_product
id_manufacturer

manufacturer
---------------
id_manufacturer
name

如何创建 SQL 查询,以便在 id_category 等于某值时选择制造商的所有名称?

【问题讨论】:

标签: sql mysql many-to-many


【解决方案1】:

这是表的直接内部连接:

SELECT m.name, cp.id_category
FROM manufacturer as m
INNER JOIN product as p
    ON m.id_manufacturer = p.id_manufacturer
INNER JOIN category_product as cp
    ON p.id_product = cp.id_product
WHERE cp.id_category = 'some value'

【讨论】:

    【解决方案2】:

    没有连接的查询将如下所示:

    SELECT m.name 
    FROM manufacturer as m, product as p, category_product as cp 
    WHERE cp.id_category = <your value>
          AND cp.id_product = p.id_product 
          AND p.id_manufacturer = m.id_manufacturer 
    

    【讨论】:

      【解决方案3】:
      Select M.name
      From   manufacturer M
      Where  M.id_manufacturer in ( Select P.id_manufacturer
                                    From   product P
                                    Where  P.id_product in ( Select C.id_product
                                                             From   category_product C
                                                             Where  C.id_category = ?))
      

      【讨论】:

      • 我知道这似乎是一种不同的方法,但是对于大型表,这种查询的性能将是可怕的...
      • 不,在 90% 的情况下,子查询比连接好
      • 您有此声明的证据(案例研究、链接)吗? X-)
      • 实际上 JOIN 和 IN 方法都会产生相同的数据库查询计划 - 所以在性能方面应该是相同的
      【解决方案4】:

      试试类似的东西

      SELECT  m.*
      FROM      category_product cp INNER JOIN
                 product p ON cp.id_product = p.id_product INNER JOIN
                 manufacturer m ON p.id_manufacturer = m.id_manufacturer
      WHERE      cp.id_category = <your_value>
      

      【讨论】:

        【解决方案5】:
        SELECT m.name, cp.id_category
        FROM manufacturer AS M INNER JOIN product AS P
            ON M.id_manufacturer = M.id_manufacturer
         INNER JOIN category_product AS CP
            ON P.id_product = CP.id_product 
        WHERE cp.id_category = 'add value'
        

        【讨论】:

        • 你能把你的代码格式化成一个代码块(每行代码左边4个空格)并为代码添加一些解释吗?
        • 感谢您的回答,但是我认为回答一个已有 8 年历史的问题并没有特别有用,该问题已经有几个非常好的答案(其中一个甚至被接受)。
        • 尤其是当这是所选答案的副本时。
        猜你喜欢
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 2012-05-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-12-31
        • 1970-01-01
        相关资源
        最近更新 更多