Eu tenho a seguinte tabela representando informações de associação:
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`)
)
- Organization_id é um membro
- o ano da associação vai de 1º de julho a 30 de junho, inicie os registros quando a associação de cada ano começar - isso pode ser em qualquer lugar no primeiro ano, mas é sempre 1º de julho, a menos que um ano seja pulado
- Membership_subcategory_id é uma categoria do setor à qual a associação se aplica a cada ano.
Preciso de uma consulta eficiente para obter a data de ingresso e a última categoria de associação.
Eu tentei esta consulta, mas recebo "Uso inválido da função de grupo" como um erro
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
Não tenho certeza se entendi seus requisitos corretamente. Esta consulta retornará, para cada organização, a
start
data mínima e a mais recentemembership_subcategory_id
(quando o pedido for atéstart
):A subconsulta será executada tantas vezes quanto o número de organizações diferentes na tabela, então a eficiência depende disso. Um índice
(organisation_id, start, membership_subcategory_id)
ativado ajudaria a minimizar o tempo de execução da subconsulta.Usando uma tabela derivada: