关键词:
【中文标题】MySQL按顺序查找每组最近/最大的记录【英文标题】:MySQL Find Most Recent/Largest Record Per Group by order by 【发布时间】:2018-09-07 02:57:07 【问题描述】:MySQL 按顺序查找每个组的最近/最大记录,以及如何最小化/缩短此查询以及每次返回组的第一行值时,而我喜欢选择组的最后一行值,并根据ja.id
对值进行排序?我知道这是一个糟糕的查询,任何人都可以建议或为我提供缩短此查询的解决方案。我已经在所有表中使用了所有必要的列索引。 如何在不使用 union all 的情况下缩短查询。union all 中的两个查询都与 where 语句中的期望相同。
SELECT
a.previous_status,
a.rejected_status,
a.rejection_reason_text,
a.rejection_reason,
a.rjaId,
a.refer_applied_status,
a.title,
a.playerId,
a.gameId,
a.gamePostDate,
a.game_referal_amount,
a.country,
a.country_name,
a.state,
a.location,
a.state_abb,
a.game_type,
a.appliedId,
a.appliedStatus,
a.admin_review,
a.is_req_referal_check,
a.memberId,
a.appliedEmail,
a.game_id,
a.referred_id,
a.memStateAbb,
a.memState,
a.memZipcode,
a.memCity,
a.memCountryNme,
a.memCountry,
a.appliedMemberName,
a.first_name,
a.primary_contact,
a.last_name,
a.addressbookImage,
a.userImage,
a.last_login,
a.user_experience_year,
a.user_experience_month,
a.current_designation,
a.current_player,
a.appliedDate,
a.addressbook_id,
a.joiningdate,
a.gameStatus,
a.gameReferalAmountType,
a.gameFreezeStatus,
a.gameFreezeMsg,
a.app_assign_back_to_rp_count,
a.applied_source,
a.max_id,
a.gamesApplied,
a.gamesAppliedId,
SUM(a.totalgameApplied) AS totalgameApplied,
a.application_assign_to_rp_status,
a.rpAppliedSource,
a.applied_on
FROM
(
(
SELECT
ja.previous_status,
ja.rejected_status,
ja.rejection_reason_text,
ja.rejection_reason,
rja.id AS rjaId,
rja. STATUS AS refer_applied_status,
jp.title,
jp.user_user_id AS playerId,
jp.id AS gameId,
jp.posted_on AS gamePostDate,
jp.game_referal_amount,
jp.country,
jp.country_name,
jp.state,
jp.location,
jp.state_abb,
jp.game_type,
ja.id AS appliedId,
IFNULL(ja. STATUS, '') AS appliedStatus,
IFNULL(ja.admin_review, '') AS admin_review,
ja.is_req_referal_check,
usr.id AS memberId,
rja.email AS appliedEmail,
rja.game_id,
rja.referred_id,
mem.state_abb AS memStateAbb,
mem.state AS memState,
mem.zipcode AS memZipcode,
mem.city AS memCity,
mem.country_name AS memCountryNme,
mem.country_code AS memCountry,
usc. NAME AS appliedMemberName,
usc.first_name,
IFNULL(
mem.primary_contact,
usc.phone_number
) AS primary_contact,
usc.last_name,
usc.profileimage_path AS addressbookImage,
usr.profile_image AS userImage,
usr.last_login,
mem.user_experience_year,
mem.user_experience_month,
mem.current_designation,
mem.current_player,
rja.create_date AS appliedDate,
rja.addressbook_id,
IFNULL(ja.joining_date, '') AS joiningdate,
jp. STATUS AS gameStatus,
jp.games_referal_amount_type AS gameReferalAmountType,
jp.game_freeze_status AS gameFreezeStatus,
jp.game_freeze_message AS gameFreezeMsg,
ja.app_assign_back_to_rp_count,
ja.applied_source,
MAX(rja.id) AS max_id,
GROUP_CONCAT(
jp.title
ORDER BY
rja.create_date DESC
) AS gamesApplied,
GROUP_CONCAT(DISTINCT(jp.id)) AS gamesAppliedId,
COUNT(DISTINCT(jp.id)) totalgameApplied,
ja.application_assign_to_rp_status,
1 AS rpAppliedSource,
rja.create_date AS applied_on
FROM
(`refer_gameapplied` AS rja)
JOIN `games_post` AS jp ON `jp`.`id` = `rja`.`game_id`
JOIN `user_socialconnections` AS usc ON `rja`.`addressbook_id` = `usc`.`id`
LEFT JOIN `user_user` AS usr ON `usr`.`email` = `rja`.`email`
LEFT JOIN `user_member` AS mem ON `mem`.`user_id` = `usr`.`id`
LEFT JOIN `game_applied` AS ja ON `ja`.`id` = `rja`.`applied_id`
WHERE
`rja`.`referby_id` = '2389'
GROUP BY
`rja`.`email`
)
UNION ALL
(
SELECT
ja.previous_status,
ja.rejected_status,
ja.rejection_reason_text,
ja.rejection_reason,
jr.id AS rjaId,
jrtm. STATUS AS refer_applied_status,
jp.title,
jp.user_user_id AS playerId,
jp.id AS gameId,
jp.posted_on AS gamePostDate,
jp.game_referal_amount,
jp.country,
jp.country_name,
jp.state,
jp.location,
jp.state_abb,
jp.game_type,
ja.id AS appliedId,
IFNULL(ja. STATUS, '') AS appliedStatus,
IFNULL(ja.admin_review, '') AS admin_review,
ja.is_req_referal_check,
usr.id AS memberId,
jrtm.referto_email AS refappliedEmail,
jr.game_id,
jrtm.id,
mem.state_abb AS memStateAbb,
mem.state AS memState,
mem.zipcode AS memZipcode,
mem.city AS memCity,
mem.country_name AS memCountryNme,
mem.country_code AS memCountry,
usc. NAME AS appliedMemberName,
usc.first_name,
IFNULL(
mem.primary_contact,
usc.phone_number
) AS primary_contact,
usc.last_name,
usc.profileimage_path AS addressbookImage,
usr.profile_image AS userImage,
usr.last_login,
mem.user_experience_year,
mem.user_experience_month,
mem.current_designation,
mem.current_player,
jrtm.refer_on AS appliedDate,
jrtm.referto_addressbookid,
IFNULL(ja.joining_date, '') AS joiningdate,
jp. STATUS AS gameStatus,
jp.games_referal_amount_type AS gameReferalAmountType,
jp.game_freeze_status AS gameFreezeStatus,
jp.game_freeze_message AS gameFreezeMsg,
ja.app_assign_back_to_rp_count,
ja.applied_source,
MAX(jrtm.id) AS max_id,
GROUP_CONCAT(
jp.title
ORDER BY
jr.refer_on DESC
) AS gamesApplied,
GROUP_CONCAT(DISTINCT(jp.id)) AS gamesAppliedId,
COUNT(DISTINCT(jp.id)) totalgameApplied,
ja.application_assign_to_rp_status,
2 AS rpAppliedSource,
jrtm.refer_on AS applied_on
FROM
(`game_refer` AS jr)
JOIN `game_refer_to_member` AS jrtm ON `jrtm`.`rid` = `jr`.`id`
JOIN `games_post` AS jp ON `jp`.`id` = `jr`.`game_id`
JOIN `user_socialconnections` AS usc ON `jrtm`.`referto_addressbookid` = `usc`.`id`
LEFT JOIN `user_user` AS usr ON `usr`.`email` = `jrtm`.`referto_email`
LEFT JOIN `user_member` AS mem ON `mem`.`user_id` = `usr`.`id`
LEFT JOIN `game_applied` AS ja ON `ja`.`referred_by` = `jrtm`.`id`
WHERE
`jrtm`.`status` = '1'
AND `jr`.`referby_user_id` = '2389'
AND `jrtm`.`refer_source` NOT IN ('4')
GROUP BY
`jrtm`.`referto_email`
)
) a
GROUP BY
a.appliedEmail
ORDER BY
a.gamesAppliedId DESC
【问题讨论】:
这是一个很大的查询,所以我们需要样本数据和预期结果。我们也有日常工作。 @âńōŋŷXmoůŜ 这似乎是一个很大的查询,但我只是在做一个联合所有...你能帮我缩短查询而不使用联合所有。联合中的两个查询都只是在 where 语句中不同 缩短查询不是简单的任务,因为我们还需要确保结果正确。我们这样做是免费的,因此我们还需要帮助以在深入研究之前了解数据。 您的查询不相同,它们从不同的表中提取不同的数据。 @âńōŋŷXmoůŜ 我知道...我会在几分钟后在问题中添加数据 【参考方案1】:这听起来像是一个“groupwise-max”问题。我添加了一个你应该研究的标签。
至少去掉与问题无关的列。
尝试折腾jrtm和jr以外的表,看看性能问题是否依然存在。 (我认为LEFT JOINs
可能是红鲱鱼。)
尝试使用UNION
的一部分,然后使用另一部分。这可以确定两者中的哪一个是更大的负担。
要添加的一些索引:
rja: (referby_id, create_date)
jrtm: (status, referto_email)
jrtm: (rid, status, referto_email)
jr: (referby_user_id, refer_on)
DISTINCT
不是一个函数。不要在DISTINCT(jp.id)
中使用父母。
【讨论】:
SQL:查找每组的最大记录[重复]
】SQL:查找每组的最大记录[重复]【英文标题】:SQL:Findthemaxrecordpergroup[duplicate]【发布时间】:2011-02-0902:12:46【问题描述】:可能重复:Retrievingthelastrecordineachgroup我有一个表,其中包含三个字段和数据。姓名,顶部,总计猫,1,10狗,2... 查看详情
在日志表上按顺序使用多个连接优化 MySQL 查询以找到最大差异(最佳记录)
】在日志表上按顺序使用多个连接优化MySQL查询以找到最大差异(最佳记录)【英文标题】:OptimizeMySQLqueryusingmultiplejoinsbyorderonloggingtabletofindgreatestdiff(bestrecords)【发布时间】:2020-06-0409:20:52【问题描述】:假设我们有一个表格来... 查看详情
mysql - 为每组分组的 SQL 结果获取具有最大值的记录[重复]
】mysql-为每组分组的SQL结果获取具有最大值的记录[重复]【英文标题】:mysql-GetrecordswithmaxvalueforeachgroupofgroupedSQLresults[duplicate]【发布时间】:2021-02-0101:29:14【问题描述】:我指的是2012年来自Yarin的this帖子。这将不再起作用,我... 查看详情
获取“最近的”分组记录(按顺序排列)
】获取“最近的”分组记录(按顺序排列)【英文标题】:Get\'mostrecent\'groupedrecord(withorderby)【发布时间】:2021-11-0405:18:20【问题描述】:我有如下查询SELECTt1.Supplier,t2.Product,FROMt1INNERJOINt2ONt1.ProductCode=t2.ProductCodeGROUPBYt1.Supplier,t2.Pr... 查看详情
获取每组分组结果的前 n 条记录
...?(组内的关系不应产生更多结果,但给出前2个按字母顺序排列)+--------+--------+ 查看详情
获取每组分组结果的前 n 条记录
...?(组内的关系不应产生更多结果,但给出前2个按字母顺序排列)+--------+--------+ 查看详情
跨 3 个表的多个记录的特定字符串的顺序查找并按最新条目显示
】跨3个表的多个记录的特定字符串的顺序查找并按最新条目显示【英文标题】:SequentialLookupofspecificstringacross3tablesformultiplerecordsanddisplaybylatestentry【发布时间】:2020-06-1303:50:32【问题描述】:我有3个表,其中我需要按顺序搜索... 查看详情
从 Postcode DB 获取 lat/lng 并在 PHP/MYSQL 中按最近的顺序排序
】从PostcodeDB获取lat/lng并在PHP/MYSQL中按最近的顺序排序【英文标题】:Getlat/lngfromPostcodeDBandorderbynearestfirstinPHP/MYSQL【发布时间】:2016-01-1022:03:48【问题描述】:我正在用PHP和MYSQL建立一个网站。我正在尝试首先按最近的位置对搜... 查看详情
SQL 查询以查找最近的记录组
】SQL查询以查找最近的记录组【英文标题】:SQLQuerytofindthemostrecentgroupofrecords【发布时间】:2013-10-2121:30:11【问题描述】:我有共享IdString的记录历史记录(每次更新的多条记录都具有完全相同的日期时间)。我想要一个查询来... 查看详情
每组保持顺序的最小值和最大值
】每组保持顺序的最小值和最大值【英文标题】:Minandmaxvaluepergroupkeepingorder【发布时间】:2020-10-1816:13:38【问题描述】:我在Redshift中遇到了一个关于分组的小问题;我有一个如下表:输入VALUECREATEDUPDATED--------------------------------... 查看详情
分块查找
分块查找法要求将列表组织成以下索引顺序结构:首先将列表分成若干个块(子表)。一般情况下,块的长度均匀,最后一块可以不满。每块中元素任意排列,即块内无序,但块与块之间有序。构造一个索引表。其中每个索引项... 查看详情
使用 MySQL 从点表中查找最近的点
】使用MySQL从点表中查找最近的点【英文标题】:FindnearestpointswithMySQLfrompointsTable【发布时间】:2016-07-0119:32:12【问题描述】:我有一个像这样的DBSchema(来自thistutorialbyGoogle)-所以他们在图中的实际点是这样的-我想要的是找到... 查看详情
查找每组其他行的最大值
】查找每组其他行的最大值【英文标题】:FindMaximalValueofotherRowsperGroup【发布时间】:2017-04-1610:28:20【问题描述】:我有一个简单的表格,其中包含分组(GRP_ID)中的值(ID)。createtabletstasselect1grp_id,1idfromdualunionallselect1grp_id,1idfromdualun... 查看详情
按纬度和经度查找最近的地方
】按纬度和经度查找最近的地方【英文标题】:Findnearestplacesbylatitudeandlongitude【发布时间】:2011-01-0715:07:36【问题描述】:我有一个存储一些地方的纬度和经度的网站,我想显示一个特定地方最近的地方(比如说,在10公里的半... 查看详情
在多对多中查找最近加入的记录
】在多对多中查找最近加入的记录【英文标题】:Findmostrecentjoinedrecordinamanytomany【发布时间】:2014-06-1722:29:22【问题描述】:运行SQL查询,该查询会调出包括最近交易在内的发票列表。要求:使用1个查询获取此信息(可能需要... 查看详情
按顺序匹配数据
】按顺序匹配数据【英文标题】:Matchdatainorder【发布时间】:2015-08-1308:59:29【问题描述】:我正在尝试根据用户搜索从多个表中获取数据。但它不符合我的要求。我要从中获取记录的表:街道城市状态假设用户输入\'a\',然后我... 查看详情
oracle查询每组的最大值
...据。追问计算相邻时间我会了。现在问题:分组查询,取每组最大值,排序追答可以用max(字段)over(),也可以用last_value(字段)over()或first_value(字段)over(),如果只要返回单值,可以用max(字段)keep(dense_rankfirse/lastorderby)本回答被提... 查看详情
c语言顺序查找程序
//顺序查找//思路:从表中最后一个记录开始,逐个进行记录的关键字和//给定值的比较,若某个记录的关键字和给定值比较相等,则//返回返回记录所在的位置,或查找完所有记录后还没有发现//符合的记录,则查找失败。#include&l... 查看详情