首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >成员资格第一次加入的快速高效查询,成员表中的最新类别(最小,最大)

成员资格第一次加入的快速高效查询,成员表中的最新类别(最小,最大)
EN

Database Administration用户
提问于 2013-03-26 01:37:37
回答 1查看 111关注 0票数 0

我有下表,代表会员资料:

代码语言:javascript
复制
    CREATE TABLE IF NOT EXISTS `membership` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `organisation_id` int(11) NOT NULL,
      `membership_subcategory_id` int(11) NOT NULL,
      `start` datetime DEFAULT NULL,
      `end` datetime DEFAULT NULL,
      `amount` decimal(9,2) DEFAULT NULL,
      `amount_paid` decimal(9,2) DEFAULT NULL,
      `notes` mediumtext,
      `order_id` int(11) DEFAULT NULL,
      `payment_type` varchar(20) NOT NULL,
      `active` tinyint(4) NOT NULL DEFAULT '1',
      `cancelled` tinyint(4) NOT NULL DEFAULT '0',
      `cancelled_date` datetime DEFAULT NULL,
      `cancellation_reason` mediumtext,
      `certificate_sent` date DEFAULT NULL,
      `welcome_email_sent` date DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `id` (`id`),
      UNIQUE KEY `order_id_2` (`order_id`,`start`,`end`,`organisation_id`),
      KEY `membership_subcategory_id_idx` (`membership_subcategory_id`),
      KEY `organisation_id_idx` (`organisation_id`),
      KEY `order_id` (`order_id`)
    )
  • organisation_id是会员
  • 会员年从7月1日到6月30日,开始记录每一年的会员情况-这可能是第一年的任何一年,但除非一年被跳过,否则它总是在7月1日。
  • membership_subcategory_id是一个行业类别,其成员资格适用于每年。

我需要一个有效的查询,以获得日期加入和最新的成员类别。

我尝试过这个查询,但是我得到了“组函数的无效使用”作为一个错误

代码语言:javascript
复制
SELECT m.organisation_id, m2.membership_subcategory_id, MIN( m.start ) 
FROM membership m
INNER JOIN membership m2 ON m.organisation_id = m2.organisation_id
WHERE MAX( m.start ) = m2.start
GROUP BY m.organisation_id, m2.membership_subcategory_id
EN

回答 1

Database Administration用户

回答已采纳

发布于 2013-03-30 08:52:59

不确定我是否正确理解了你的要求。该查询将为每个组织返回最小的start日期和最新的membership_subcategory_id (当订单是start的时候):

代码语言:javascript
复制
SELECT    organisation_id, 
            MIN(`start`) AS 
          first_start_date,
            ( SELECT    m2.membership_subcategory_id
              FROM      membership AS m2
              WHERE     m2.organisation_id = m.organisation_id
              ORDER BY  m2.`start` DESC
                LIMIT 1
            ) AS 
          last_membership_subcategory_id
FROM      membership AS m
GROUP BY  organisation_id ;

子查询的执行次数将与表中不同组织的数量相同,因此效率取决于此。(organisation_id, start, membership_subcategory_id)上的索引将有助于最小化子查询执行时间。

使用派生表:

代码语言:javascript
复制
SELECT    gm.organisation_id, 
          gm.first_start_date,
          m.membership_subcategory_id AS last_membership_subcategory_id,
          m.*                           --- whatever other data you want
                                        --- from the latest `start` date
FROM      ( SELECT    organisation_id, 
                      MIN(`start`) AS first_start_date,
                      MAX(`start`) AS last_start_date
            FROM      membership
            GROUP BY  organisation_id 
          ) AS gm 
    JOIN
          membership AS m
              ON  m.organisation_id = gm.organisation_id
              AND m.`start` = gm.last_start_date
  ;
票数 1
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/37560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档