【问题标题】:How can I select the required records?如何选择所需的记录?
【发布时间】:2010-12-26 23:17:40
【问题描述】:

表格:

  • 产品:[id, name, brand_id, is_published]
  • 品牌:[id, name, is_published]
  • 奖项:[id, name]
  • ProductAwards [product_id,award_id]

如何选择已发布品牌列表以及已发布品牌产品的奖项数量。

除了在计算奖项时发布“is_published”限制之外,我对所有部分都很满意。

我希望这很清楚;任何人都可以建议在哪里挖掘吗?

【问题讨论】:

  • 您能否发布到目前为止的查询、您的查询不起作用的某些数据的示例、您对示例数据的查询输出以及您实际想要的输出数据?

标签: sql mysql doctrine


【解决方案1】:

我猜这是您要查找的查询:

SELECT Brand.name, COUNT(Awards.id) AS Awards
FROM Brand
LEFT JOIN Product ON product.brand_id = Brand.id AND Product.is_published = TRUE /* This may need to be changed based on the data type of is_published */
LEFT JOIN ProductAwards ON ProductAwards.product_id = Product.id
LEFT JOIN Awards ON Awards.id = ProductAwards.award_id
WHERE Brand.is_published = TRUE /* As with Product.is_published, this clause is dependent on the column's data type */

要获得更明智的答案,您可能需要为每个表发布 SHOW CREATE TABLE 的结果,以及您正在寻找的结果类型的示例。希望这会有所帮助!

【讨论】:

  • COUNT(Awards.ID) 如果所有行都为空,则返回 0(并且只计算非空值)。 IFNULL 可能不需要。
  • @Jonathan Leffler 啊,非常正确 - 我在 NULL 预防中被冲昏了头脑。
【解决方案2】:

假设执行了参照完整性,因此 ProductAwards 表中没有错误条目,您实际上不需要从 Awards 表中进行选择:

SELECT B.Name, COUNT(PA.Award_ID) AS Num_Awards
  FROM Brand              AS B
  LEFT JOIN Product       AS P  ON P.Brand_ID = B.ID AND P.Is_Published = TRUE
  LEFT JOIN ProductAwards AS PA ON PA.Product_ID = P.ID
 WHERE B.Is_Published = TRUE

如果某个品牌没有奖项,则 COUNT(PA.Award_ID) 将返回零,因为 COUNT(column) 计算非空值的数量。

【讨论】:

    【解决方案3】:
    SELECT b.name, count(pa.award_id) as Quantity
    FROM PRODUCT p 
          LEFT JOIN Brand b ON p.brand_id = b.id
          LEFT JOIN ProductAwards pa on p.Product_id = pa.product_id
          LEFT JOIN Awards a ON a.award_id = pa.award_id
    WHERE p.is_published = 1
    GROUP BY b.name
    

    这样的?

    【讨论】:

      【解决方案4】:

      如果您有一个查询(如果我正确地阅读了问题)除了已发布的限制外 100% 有效,那么限制是微不足道的 - 只需将 AND is_published = 1 添加到 WHERE 子句(或添加 WHERE is_published = 1 如果您的查询没有 WHERE 子句)。

      以上假设 is_published 是一个包含 0 或 1 的整数,表示未发布或已发布。如果列不同,则需要相应地更改表达式。

      【讨论】:

        【解决方案5】:

        您可以尝试此查询以获取每个品牌 ID 所需的计数

        SELECT b1.id, COUNT(pa.award_id) [No of awards]
        FROM Brand1 b1 left join Product p
        ON p.brand_id=b1.id AND p.is_published=1 AND b1.is_published=1
        LEFT JOIN ProductAwards pa
        ON pa.product_id = p.id
        LEFT JOIN Awards a
        ON a.id=pa.award_id
        GROUP BY b1.id
        

        【讨论】:

          猜你喜欢
          • 2013-04-17
          • 2023-02-22
          • 2021-10-10
          • 1970-01-01
          • 2013-10-07
          • 2013-11-24
          • 1970-01-01
          • 2021-01-01
          • 1970-01-01
          相关资源
          最近更新 更多