多联表

时间:2018-05-29 16:53:37

标签: mysql sql left-join inner-join

我有4张桌子

customers
sales
sale_items
stock_items

我想列出所有客户。对于每个客户,我想要购买的总金额 - 我希望sql查询创建的字段(xxx as totalSales)

我尝试选择客户作为主表并加入其他表。我尝试选择销售作为主要表格以及sale_items。我得到了正确的总和计算,但它会首先向我显示第一个客户。

这就是我的表格:

*TABLE customers*
id
customer_name
email

*TABLE sales*
id
customer_id
transaction_date

*TABLE sale_items*
id
sale_id
stock_item_id

*TABLE stock_items*
id
item_name
price

我想

  • 创建所有客户的列表,按客户排序,销售额最高(按值计算)。不是销售额,而是销售总额(销售额)
  • 以客户名称显示每位客户购买的商品。这不是每个订单,而是所有销售。因此,如果客户X购买了一罐咖啡,每个咖啡超过4个订单,则咖啡罐将显示4次。虽然如果可能,我喜欢列出的项目a-z。

我内心加入了彼此的表格,所以我会得到所有交易的清单。我尝试过SELECT * FROM客户,尝试过FROM sales,尝试使用sale_items。我已尝试过GROUP_BY customer_id,但之后我会得到错误的计数。

我想这样显示数据。

CUSTOMER                    ITEMS                   TOTAL VALUE
John Doe                    Coffee
                            Milk
                            Tea
                            Milk
                            Bread
                            Coffee                  500

Jane Doe                    Coffee
                            Milk
                            Coke                    350

Denver Doe                  Coffee
                            Milk
                            Bread
                            Bread                   125

我不想使用PHP并查询每一个"事情"。我正在尝试运行一两个查询。

1 个答案:

答案 0 :(得分:1)

我不认为您能够像他们一样显示(除非您查看<strong>Value</strong>函数),但是那个&# 39;可能不是你的要求。

我认为你应该使用ROLLUP这是一个类似于GROUP_CONCAT的聚合函数,但它会在所有值中创建一个以逗号分隔的列表:

SUM

您应该看到的示例行是:

SELECT 
*
SUM(sale_amount) as total_sales,
GROUP_CONCAT(item_name) as item_names
FROM customers c
JOIN sales s USING (customer_id)
JOIN sale_items si USING (sale_id)
JOIN stock_items sit USING (stock_item_id)
GROUP BY customer_id

(我必须编写一些列名,比如sale_amount,但你必须在那里有那些我确定。你必须对这些名称进行一些调整,也许我必须如何做也可以加入,但如果我了解您的需求,这应该会有一些变化。