MySQL SELECT来自两个表COUNT

时间:2014-12-02 09:41:20

标签: mysql

我有两张表格如下:

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组计算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;

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

3 个答案:

答案 0 :(得分:2)

你在这里发出的问题是,你告诉数据库这两个表是如何“连接”的,或者它们应该连接的是什么:

看一下这张图片:

enter image description here

~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。< / p>

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

LEFT联接将用于您希望从左侧表格中检索所有数据的情况,以及仅从右侧匹配的数据。

执行时间

虽然在这种情况下接受的答案可能适用于小型数据集,但在较大的数据库中可能会变得“沉重”。这是因为这种操作不是实际设计

这是 加入 的目的。

数据库系统中的大量工作旨在有效实现连接,因为关系系统通常需要连接,但在优化其高效执行方面却面临困难。问题出现是因为内连接既可以交换也可以相关联地运行。Wikipedia

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

其他加入/摘要

  • ANNER JOIN将返回两个表中的数据,其中每个表中的键匹配
  • LEFT JOIN或RIGHT JOIN将返回一个表中的所有行,并匹配另一个表中的数据。
  • 如果要查询多个表,请使用联接。
  • 连接比查询>=2表的其他方式快得多(在较大的数据集上可以看到速度更快)。

答案 1 :(得分:1)

也许左连接会帮助你

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;

答案 2 :(得分:1)

你可以尝试这个:

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;