MySQL按顺序查找每组最近/最大的记录

     2023-02-16     122

关键词:

【中文标题】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... 查看详情