【问题标题】:How to select from two tables in MySQL even if not all rows in one table have corespondents in the other?即使不是一个表中的所有行在另一个表中都有核心响应者,如何从 MySQL 中的两个表中进行选择?
【发布时间】:2010-10-19 14:34:20
【问题描述】:

我有两张网店的桌子:

  • 一个用于类别:id、title
  • 一个用于产品:id、ownerid、title、price(ownerid 是父类别的 id)

我想选择所有类别并选择每个类别的最低和最高价格,因此查询如下:

SELECT
sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
FROM
categories AS sc, products AS s
WHERE s.ownerid=sc.id
GROUP BY sc.id

它的工作原理与预期的差不多,唯一的例外是如果一个类别中没有任何产品,那么它就不会被选中。虽然这似乎合乎逻辑,因为我要求“s.ownerid=sc.id”,但我不知道足够的 SQL 以使其按预期工作。我需要所有类别,对于没有产品的类别,minp 和 maxp 应该为 0。

有什么建议吗?谢谢。

【问题讨论】:

标签: mysql join


【解决方案1】:

为此,您需要一个外部联接。顺便说一句,使用隐式连接编写查询的方式已经过时,不再推荐。建议使用 JOIN 关键字。这也使得将内部联接更改为外部联接变得更加容易。

FROM categories AS sc
LEFT JOIN products AS s
ON s.ownerid=sc.id

要返回 0 而不是 NULL,请使用 IFNULL(..., 0)。整个查询变为:

SELECT
    sc.*,
    IFNULL(MIN(s.price), 0) AS minp,
    IFNULL(MAX(s.price), 0) AS maxp
FROM categories AS sc
LEFT JOIN products AS s
ON s.ownerid = sc.id
GROUP BY sc.id

您可能还想考虑对于没有产品的类别返回默认 NULL 而不是 0 是否更好。

【讨论】:

    【解决方案2】:

    LEFT JOIN (W3Schools) 怎么样?

    SELECT
    sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
    FROM
    categories AS sc
    LEFT JOIN products AS s
    ON s.ownerid=sc.id
    GROUP BY sc.id
    

    【讨论】:

      【解决方案3】:

      你想进行左连接:

      SELECT
      sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
      FROM
      categories AS sc 
      LEFT JOIN products AS s on s.ownerid=sc.id
      GROUP BY sc.id
      

      使用左连接时,您会从左连接(此处为类别)左侧的表中获取数据,如果存在则从右侧获取。

      【讨论】:

        【解决方案4】:

        我认为你想要的是 LEFT JOIN, 例如:

        SELECT
        sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
        FROM categories sc
        LEFT JOIN products s ON s.ownerid = sc.id
        GROUP BY sc.id

        【讨论】:

          【解决方案5】:

          尝试使用左连接:

          SELECT sc.*, MIN(s.price) AS minp, MAX(s.price) AS maxp
          FROM categories AS sc
          LEFT JOIN products AS s ON s.ownerid = sc.id
          GROUP BY sc.id
          

          但是,毫无疑问,使用笛卡尔积并不是最好的解决方案。大多数引擎应该能够“远离”优化它,但在大多数情况下,连接也更加直观——而且速度更快,这是有疑问的。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2012-07-30
            • 2017-02-11
            • 1970-01-01
            • 2011-03-30
            • 2013-06-04
            • 1970-01-01
            相关资源
            最近更新 更多