Mysql 仅选择具有内部联接查询的唯一行

Mysql 仅选择具有内部联接查询的唯一行,mysql,sql,Mysql,Sql,对不起,我不太清楚这个词怎么说 有两个数据库表,store\u locations和store\u diagnostics store\u locations保存有关商店的静态信息,例如zip\u code、StoreId和其他一些信息。而store\u diagnostics保存每个门店的诊断数据和统计数据,例如total\u salled,total\u revenue等 每隔一个小时左右,通过检查总销售额等的cron作业将新条目输入到store_diagnostics中。代表我的唯一问题是

对不起,我不太清楚这个词怎么说

有两个数据库表,
store\u locations
store\u diagnostics

store\u locations
保存有关商店的静态信息,例如
zip\u code
StoreId
和其他一些信息。而
store\u diagnostics
保存每个门店的诊断数据和统计数据,例如
total\u salled
total\u revenue

每隔一个小时左右,通过检查总销售额等的cron作业将新条目输入到
store_diagnostics
中。代表我的唯一问题是,不是更新以前存在的行,而是在每次cron作业运行时创建新行,以便将本周的销售额与上周的销售额进行比较等

我当前的查询工作正常,但它为同一个存储获取多个条目。理想情况下,我只想为给定的
StoreId
获取最新的
store\u diagnostics
行,并按
created
字段降序对它们进行排序,以便获得该特定存储的最后创建行

以下是我现有的查询:

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
只获取一个结果,并且我希望在按照
DESC
中的
created
列对行进行排序后获取该结果

location\u stats.total\u selled
是我希望在所有结果中使用的排序方法,因此所有独特的商店都会根据其销售的商品总量进行排序


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

我添加了一个where子句,该子句根据创建的最大值进行过滤,如果按降序排序,该值将是最大值。总体排序顺序已更改为问题描述中所示的总销售数量。注意,如果cron作业生成新行的速度快于创建的精度,则会得到重复的行。我想不会的。如果你有一个PK-in-store_-diagnostics的身份,我会最大限度地使用它,而不是创建它

选项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

我添加了一个where子句,该子句根据创建的最大值进行过滤,如果按降序排序,该值将是最大值。总体排序顺序已更改为问题描述中所示的总销售数量。注意,如果cron作业生成新行的速度快于创建的精度,则会得到重复的行。我想不会的。如果你有一个PK-in-store_-diagnostics的身份,我会最大限度地使用它,而不是创建它

选项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

瞧,我想这可能行得通,但这可能是最糟糕的方式之一;由于您使用的是相关子查询,因此它将对
store\u diagnostics
中的每个条目在
store\u diagnostics
上运行单独的聚合查询。除非使用未记录的优化器技巧,否则如果一个位置有100个条目,它将分别100次查找该位置的最后一个条目,以丢弃其中99个条目。@Uuerdo同意。添加了另一个选项。我认为这可能有效,但这可能是最糟糕的方法之一;由于您使用的是相关子查询,因此它将对
store\u diagnostics
中的每个条目在
store\u diagnostics
上运行单独的聚合查询。除非使用未记录的优化器技巧,否则如果一个位置有100个条目,它将分别100次查找该位置的最后一个条目,以丢弃其中99个条目。@Uuerdo同意。增加了另一个选项。