抱歉,不太清楚怎么说这个。
有两个数据库表,store_locations
和store_diagnostics
。
store_locations
包含有关商店的静态信息,例如zip_code
,StoreId
和其他一些内容。虽然store_diagnostics
包含每个商店位置的诊断数据和统计信息,例如total_sold
,total_revenue
等。
通过检查总销售额等的cron作业每小时左右将新条目输入store_diagnostics
。代表我的唯一问题是,不是更新以前存在的行,而是创建一个新行每次cron工作运行,以便本周的销售额可以与上周相比等。
我当前的查询有效,但它为同一商店提取多个条目。理想情况下,我只想获取给定store_diagnostics
的最新StoreId
行,并按created
字段降序排序,以便获取该特定商店的最后一行。< / p>
这是我现有的查询:
SELECT
locations.* ,
location_stats.total_sold ,
location_stats.total_moved_to ,
location_stats.total_moved_from ,
location_stats.total_revenue ,
location_stats.created
FROM store_locations locations
INNER JOIN
store_diagnostics location_stats
ON
locations.StoreId = location_stats.StoreId
ORDER BY location_stats.created DESC , location_stats.total_sold DESC
正如您所看到的,我只想按StoreId
获取一个结果,并且我希望在created
列DESC
列对行进行排序后获取该结果顺序。
location_stats.total_sold
是我希望在所有结果中使用的排序方法,因此所有独特商店都按其销售的商品总数进行排序。
如果不清楚我很抱歉,我希望我已经充分解释了。
答案 0 :(得分:2)
我添加了一个where子句,根据创建的最大值进行过滤,如果按降序排序,它将是最高值。整体排序顺序已更改为total_sold,如问题说明中所示。请注意,如果您的cron作业生成的新行快于创建的精度,您将获得重复。我假设它没有。如果你在store_diagnostics中拥有PK作为身份,那么我将采用最大值而不是创建它。
选项1:使用相关子查询
SELECT
locations.* ,
location_stats.total_sold ,
location_stats.total_moved_to ,
location_stats.total_moved_from ,
location_stats.total_revenue ,
location_stats.created
FROM store_locations locations
INNER JOIN store_diagnostics location_stats ON locations.StoreId = location_stats.StoreId
WHERE location_stats.created = (select max(created) from store_diagnostics where stored_id = locations.stored_id)
ORDER BY location_stats.total_sold DESC
选项2:加入groupby
SELECT
locations.* ,
location_stats.total_sold ,
location_stats.total_moved_to ,
location_stats.total_moved_from ,
location_stats.total_revenue ,
location_stats.created
FROM store_locations locations
INNER JOIN store_diagnostics location_stats ON locations.StoreId = location_stats.StoreId
INNER JOIN (select store_id, max(created) created from stored_diagnostics group by store_id) mx on locations.store_id = mx.stored_id and location_stats.created = mx.created
ORDER BY location_stats.total_sold DESC