【问题标题】:Restricting an SQL query to certain fields in a table not used by the query将 SQL 查询限制为查询未使用的表中的某些字段
【发布时间】:2010-07-07 07:02:10
【问题描述】:

我有一个产品表,其中包含 varchar、varchar 和 double 类型的字段 productname、category 和 cost。

然后我有一个销售表,其中包含字段 productname、cost 和 saledate,类型为 varchar、double 和 date。

最后,我有一个采购表,其中包含字段 purchase、cost 和 purchaseate,类型为 varchar、double 和 date。

我想计算特定日期、特定类别的销售数量。

我现在有这个查询来显示一年的每月总计:

SELECT month(saledate), SUM(cost)
FROM sales
GROUP BY month(saledate)
UNION ALL
SELECT month(purchasedate), SUM(cost)
FROM purchases
GROUP BY month(purchasedate)

我怎样才能将其限制为某些类别?

要从产品中定义某些类别,例如食品和饮料,并在我的计算中只包括这些类别中的产品?

【问题讨论】:

标签: sql mysql


【解决方案1】:
SELECT month(saledate), SUM(sales.cost)
FROM sales, products
WHERE sales.productname=products.productname
AND category='food'
GROUP BY month(saledate)
UNION ALL
SELECT month(purchasedate), SUM(purchases.cost)
FROM purchases, products
WHERE purchases.productname=products.productname
AND category='food'
GROUP BY month(purchasedate)

该表需要成为 SQL 语句的一部分,以便根据其中包含的某些值来限制结果集行。

【讨论】:

  • 完美...只是一个简单的问题,但要在 sql 中执行 OR,只需 category='food' || '啤酒' || '烟'...?
  • 使用 OR 这个词。类别='食物'或类别='啤酒'。
  • 另外,请注意下面的 Jun1st 是正确的:当您使用此查询时,类别实际上从结果总数中排除
【解决方案2】:

只需添加一个像这样的 WHERE 子句:

[...] WHERE products.category = 'food' 或 prodcuts.category = 'drink' [...]

【讨论】:

    【解决方案3】:

    如果你希望你的计算结果不包括这些类别,你应该使用 WHERE。

    否则,使用 HAVING

    【讨论】:

      【解决方案4】:

      我倾向于使用子查询而不是联接,我认为您希望在联合的两个部分都使用它。但是Borealid的回答是相当合理的。区别在于口味。

      SELECT month(saledate),
             SUM(sales.cost)
          FROM sales, products
          WHERE EXISTS (SELECT *
                        FROM products
                        WHERE purchases.productname = products.productname AND
                              category              = 'food')
          GROUP BY month(saledate)
      UNION ALL
      SELECT month(purchasedate),
             SUM(purchases.cost)
          FROM purchases, products
          WHERE EXISTS (SELECT *
                            FROM products
                            WHERE purchases.productname = products.productname AND
                                  category              = 'food')
          GROUP BY month(purchasedate)
      

      【讨论】:

      • 做一个子查询有什么好处,还是你说的只是口味问题?另外,愚蠢的问题,但是我将如何在 SQL 中执行 AND 来显示许多类别...只是 && ?
      • 您实际上有一个在 Hooper 先生的回答中执行 AND 的示例。不,在这种情况下,子查询和连接之间没有真正的区别。一般来说,必须注意爆炸性的 JOIN 和低效/不必要的子查询,它们是不同的性能恶魔,但这里唯一的区别是可读性。选择你认为更容易理解的那个。
      • 除了让我头疼的连接之外,还有许多不同类型的连接以及其中涉及的一些微妙之处。如果你在家和他们在一起,那很好。使用子查询,所见即所得。在任何情况下,查询优化器通常都会为您重写它们。 “显示许多类别”是什么意思?如果要在此查询中包含许多类别,则需要一个 OR (category='food' OR category='drink')。无论如何,AND 是单词,而不是 &&。
      • 谢谢两位的详细解释。
      猜你喜欢
      • 2019-10-09
      • 2023-01-18
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多