Estou usando mysql e tenho duas tabelas, produto e revisão.
Juntando-os me dá a seguinte tabela:
SELECT *
FROM product AS p
INNER JOIN revisions AS r ON p.revision_id = r.id
ORDER BY p.id;
| id | name | prices | revision_id | id | revision_status |
|----|----------|--------|-------------|----|-----------------|
| 1 | Produkt1 | 10 | 1 | 1 | 1 |
| 2 | Produkt1 | 4 | 2 | 2 | 0 |
| 3 | Produkt1 | 2 | 3 | 3 | null |
| 4 | Product2 | 42 | 4 | 4 | 1 |
| 5 | Produkt2 | 43 | 5 | 5 | null |
| 6 | Produkt2 | 78 | 6 | 6 | 0 |
| 7 | Produkt3 | 1 | 7 | 7 | 1 |
| 8 | Produkt3 | 3 | 8 | 8 | null |
| 9 | Produkt3 | 4 | 9 | 9 | null |
| 10 | Produkt4 | 33 | 10 | 10 | 1 |
Um Produto tem um ID exclusivo que identifica um produto. Devido a alterações de preços cada produto pode ter vários preços diferentes. Cada produto tem um ID de revisão.
A tabela de revisão tem um revision_status e pode ter três valores diferentes: 1
for approved price
, 0
for closed revision
e null
for to be revised
.
Como resultado final gostaria de obter todos os registros que possuem revision_status = 1
e também um arquivo revision_status = null
.
Resultado final
| id | name | prices | revision_id | id | revision_status |
|----|----------|--------|-------------|----|-----------------|
| 1 | Produkt1 | 10 | 1 | 1 | 1 |
| 3 | Produkt1 | 2 | 3 | 3 | null |
| 4 | Product2 | 42 | 4 | 4 | 1 |
| 5 | Produkt2 | 43 | 5 | 5 | null |
| 7 | Produkt3 | 1 | 7 | 7 | 1 |
| 8 | Produkt3 | 3 | 8 | 8 | null |
| 9 | Produkt3 | 4 | 9 | 9 | null |
Eu tentei o seguinte:
SELECT *
FROM product AS p
INNER JOIN revisions AS r ON p.revision_id = r.id
WHERE p.name IN (
SELECT p.name
FROM product AS p
INNER JOIN revisions AS r ON p.revision_id = r.id
GROUP BY p.name
HAVING COUNT(r.revision_status) > 1)
ORDER BY p.id;
No entanto, isso também me dá revisões de volta que têm umrevision_status = 0
Eu criei este sqlfiddle como um exemplo mínimo viável.
1 Produto pode ter 1 Revisão. Inicialmente um produto tem revision_status
de nulo. Depois de verificado, o status é definido como 1 - aprovado - ou 0 - não aprovado. Na aplicação tenho uma lógica, que apenas 1 produto - com o mesmo nome - pode ter revision_status 1. Estou procurando uma forma de mostrar todas as revisões que possuem revision_status 1 e null e exibir os 1ns sempre em cima dos nulls. (Como mostrado na tabela de resultados).
Tente a seguinte consulta (para iniciantes):
Se isso fornecer o resultado necessário, talvez devêssemos cobrir os casos (revision_status) '1' e 'null' explicitamente, refatorando a cláusula WHERE da seguinte maneira: