使用INNER JOIN查询

时间:2017-08-14 21:48:34

标签: mysql sql

抱歉,不太清楚怎么说这个。

有两个数据库表,store_locationsstore_diagnostics

store_locations包含有关商店的静态信息,例如zip_codeStoreId和其他一些内容。虽然store_diagnostics包含每个商店位置的诊断数据和统计信息,例如total_soldtotal_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获取一个结果,并且我希望在createdDESC列对行进行排序后获取该结果顺序。

location_stats.total_sold是我希望在所有结果中使用的排序方法,因此所有独特商店都按其销售的商品总数进行排序。

如果不清楚我很抱歉,我希望我已经充分解释了。

1 个答案:

答案 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