查询:
SELECT purchases.*
FROM purchases
LEFT JOIN purchases as p
ON
p.customer = purchases.customer
AND
purchases.total < p.total
WHERE p.total IS NULL
这是怎么回事!(我去过那里)
我们希望确保每次购买的总金额最高。
一些理论知识(如果您只想了解查询,请跳过此部分)
让Total是一个函数T(customer,id),其中它返回一个给定名称和id的值为了证明给定的总数(T(customer,id))是最高的,我们必须证明我们想证明
∀x T(customer,id)>T(customer,x)(这个总数高于所有其他该客户的总计)
OR
∃x T(customer,id)<T(customers,x)(不存在更高的总数该客户)
第一种方法需要我们获取我不太喜欢的名字的所有记录。
第二个将需要一个聪明的方式来表示,没有比这个更高的记录了。
返回SQL
如果我们在表的名称和总数小于连接表的情况下留下连接表:
LEFT JOIN purchases as p
ON
p.customer = purchases.customer
AND
purchases.total < p.total
我们确保要加入的同一用户的另一条记录总数较高的所有记录:
+--------------+---------------------+-----------------+------+------------+---------+
| purchases.id | purchases.customer | purchases.total | p.id | p.customer | p.total |
+--------------+---------------------+-----------------+------+------------+---------+
| 1 | Tom | 200 | 2 | Tom | 300 |
| 2 | Tom | 300 | | | |
| 3 | Bob | 400 | 4 | Bob | 500 |
| 4 | Bob | 500 | | | |
| 5 | Alice | 600 | 6 | Alice | 700 |
| 6 | Alice | 700 | | | |
+--------------+---------------------+-----------------+------+------------+---------+
这将有助于我们在不需要分组的情况下筛选每次购买的最高总额:
WHERE p.total IS NULL
+--------------+----------------+-----------------+------+--------+---------+
| purchases.id | purchases.name | purchases.total | p.id | p.name | p.total |
+--------------+----------------+-----------------+------+--------+---------+
| 2 | Tom | 300 | | | |
| 4 | Bob | 500 | | | |
| 6 | Alice | 700 | | | |
+--------------+----------------+-----------------+------+--------+---------+
这就是我们需要的答案。