【问题标题】:MySQL SELECT from two tables with COUNTMySQL 从具有 COUNT 的两个表中选择
【发布时间】:2014-12-02 09:41:19
【问题描述】:

我有两个表如下:

Table 1 "customer"   with fields   "Cust_id", "first_name",  "last_name"    (10 customers)
Table 2 "cust_order" with fields   "order_id", "cust_id",                   (26 orders)

我需要显示"Cust_id" "first_name" "last_name" "order_id"

到我需要order_id group by cust_id 的计数,例如列出每个客户下的订单总数。

我在查询下方运行,但是,它正在计算所有 26 个订单并将这 26 个订单应用到每个客户。

SELECT COUNT(order_id), cus.cust_id, cus.first_name, cus.last_name
FROM cust_order, customer cus
GROUP BY cust_id;

您能否建议/建议查询中有什么问题?

【问题讨论】:

  • 主要问题是您没有在查询中的两个表之间进行任何联接。
  • 嗨 Siva,我运行下面的查询并加入表但给出相同的结果:SELECT COUNT(order_id), cus.cust_id, cus.first_name, cus.last_name FROM cust_order JOIN customer cus GROUP BY cust_id am i这里做错了什么?
  • 你需要说出加入的类型。有关可能连接的详细信息,请参阅我的答案,以及说明它们如何连接的 ON 部分(查询在执行时不会真正查看关系,除非您告诉他们)

标签: mysql


【解决方案1】:

您在这里的问题是您已经告诉数据库这两个表是如何“连接”的,或者它们应该通过什么连接:

看看这张图片:

~IMAGE SOURCE

这有效地允许您将两个表“连接”在一起,并在它们之间使用查询。

所以你可能想使用类似的东西:

SELECT COUNT(B.order_id), A.cust_id, A.first_name, A.last_name 
FROM customer A
LEFT JOIN cust_order B     //this is using a left join, but an inner may be appropriate also
ON (A.cust_id= B.Cust_id)  //what links them together
GROUP BY A.cust_id;        // the group by clause

根据您要求提供更多信息的评论:

左连接(右连接几乎相同,只是相反):

SQL LEFT JOIN 返回左表中的所有行,即使右表中没有匹配项。这意味着如果 ON 子句匹配右表中的 0(零)条记录,则连接仍将在结果中返回一行,但右表中的每一列都为 NULL。 ~Tutorials Point

这意味着左连接返回左表中的所有值,加上右表中的匹配值,如果没有匹配的连接谓词,则返回 NULL。

如果您希望从左侧表中检索所有数据,并且仅从右侧匹配的数据,则将使用左连接。

执行时间

虽然在这种情况下接受的答案可能在小型数据集中运行良好,但在大型数据库中可能会变得“沉重”。这是因为它实际上并不是为这种操作设计的

这就是引入Joins的目的。

数据库系统中的许多工作都旨在高效实现连接,因为关系系统通常需要连接,但在优化其高效执行方面面临困难。问题的出现是因为内连接既可交换又可关联。 ~Wikipedia

实际上,这意味着用户只需提供要连接的表列表和要使用的连接条件,而数据库系统的任务是确定执行操作的最有效方式。查询优化器确定如何执行包含连接的查询。因此,通过允许 dbms选择查询您的数据的方式,您可以节省大量时间

其他联接/摘要

  • INNER JOIN 将从两个表中返回每个表中的键匹配的数据
  • LEFT JOIN 或 RIGHT JOIN 将返回一个表中的所有行和另一个表中的匹配数据。
  • 要查询多个表时使用联接。
  • 联接比查询>=2 表的其他方式快得多(在较大的数据集上速度更快)。

【讨论】:

  • 您好 jbutler483,非常感谢您的详细解释。它确实有助于理解连接表的概念。非常感谢。问候,维库
  • 在您的 select 语句中将别名 cus 更改为 A
【解决方案2】:

你可以试试这个:

SELECT COUNT(cus_order.order_id), cus.cust_id, cus.first_name, cus.last_name 
FROM cust_order cus_order, customer cus 
WHERE cus_order.cust_id = cus.cust_id
GROUP BY cust_id;

【讨论】:

  • 嗨,Mehdi,这就像款待一样,非常感谢。问候,维库
  • 一个可能的问题是它比使用更大数据集的连接效率要低得多
  • 您好 jbutler483,很抱歉问您很多问题,因为我是 SQL 新手。所以,如果我理解正确,在大型数据集中,WHERE 命令会花费大量时间来执行,或者它可能不会显示完整的结果。我真的很喜欢你下面的帖子。如果这对你来说没有太大的麻烦,你能解释一下 LEFT 和 RIGHT JOIN 吗?问候,维库
  • @Viku 很抱歉现在才看到这个(将来,就像在 facebook 中标记一些,在他们的用户名前加上 @ 符号),但已经在我的帖子中添加了说明。
【解决方案3】:

也许左连接会帮助你

SELECT COUNT(order_id), cus.cust_id, cus.first_name, cus.last_name ]
FROM customer cus 
LEFT JOIN cust_order co 
ON (co.cust_id= cus.Cust_id ) 
GROUP BY cus.cust_id;

【讨论】:

  • 嗨 senK,非常感谢。这完美地工作。问候,维库
猜你喜欢
  • 2020-01-03
  • 2011-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-30
  • 1970-01-01
  • 1970-01-01
  • 2010-10-11
相关资源
最近更新 更多