Tenho uma tabela com a seguinte estrutura
finals(ID, name, result)
CREATE TABLE `finals` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(10) DEFAULT NULL,
`result` char(4) DEFAULT NULL,
PRIMARY KEY (`id`)
);
Onde:
ID
é uma tecla de incremento automático,name
é o nome da pessoa,result
é aprovado ou reprovado
Dados de amostra
mysql> select * from finals;
+----+------+--------+
| id | name | result |
+----+------+--------+
| 1 | John | Pass |
| 2 | John | Fail |
| 3 | John | Pass |
| 4 | Kyle | Pass |
| 5 | John | Pass |
| 6 | Kyle | Pass |
| 7 | Kyle | Pass |
| 8 | Kyle | Fail |
+----+------+--------+
8 rows in set (0.00 sec)
Explicação
Estou tentando obter os nomes das pessoas que têm pelo menos 3 "Pass" consecutivos . Portanto, o resultado desejado é: "Kyle" Porque "Kyle" tem 3 "Pass" cosecutivos, IDs 4, 6, 7 .
Observe que não me importo se esta sequência for interrompida por um registro de outra pessoa, mas me importo se for interrompida por um registro da mesma pessoa com o valor "Fail" no resultado.
É por isso que "John" não está no resultado desejado. ou seja, embora "John" tenha 3 "pass" no total, eles são interrompidos com um "Fail", então quero excluí-lo do resultado.
Eu tentei esta consulta:
mysql> SELECT name, GROUP_CONCAT(result ORDER BY id) as result_str FROM finals GROUP BY name having result_str LIKE '%Pass,Pass,Pass%';
+------+---------------------+
| name | result_str |
+------+---------------------+
| Kyle | Pass,Pass,Pass,Fail |
+------+---------------------+
1 row in set (0.00 sec)
Funciona, e este é o resultado desejado. No entanto, estou procurando maneiras alternativas de
- Seja mais genérico
- evite as restrições no comprimento do resultado de GROUP_CONCAT.
Agradeço antecipadamente.
Eu tenho uma solução que não precisa
GROUP_CONCAT
SOLUÇÃO PROPOSTA
SOLUÇÃO PROPOSTA EXECUTADA
SAÍDA DA SUBCONSULTA
DE UMA CHANCE !!!
Acabei de responder a uma pergunta semelhante há 2 dias ( Valor lógico da expressão de atribuição )