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同意。增加了另一个选项。