我有下表,代表会员资料:
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`)
)我需要一个有效的查询,以获得日期加入和最新的成员类别。
我尝试过这个查询,但是我得到了“组函数的无效使用”作为一个错误
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发布于 2013-03-30 08:52:59
不确定我是否正确理解了你的要求。该查询将为每个组织返回最小的start日期和最新的membership_subcategory_id (当订单是start的时候):
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)上的索引将有助于最小化子查询执行时间。
使用派生表:
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
;https://dba.stackexchange.com/questions/37560
复制相似问题