edbird88 edbird88 - 4 months ago 14
MySQL Question

Ignore part string and distinct

I have a query that looks something like this:

SELECT paginas_acesso.id, tipo_acesso, tipos_acesso.nome_modulo, nome_pagina, IF(nome_pagina LIKE '/main%', TRUE, FALSE) AS main, IF(nome_pagina LIKE '/test%', TRUE, FALSE) AS test
FROM paginas_acesso
LEFT JOIN tipos_acesso ON tipo_acesso=tipos_acesso.id
WHERE tipo_acesso=40
ORDER BY nome_pagina ASC


The result is this:

id tipo_acesso nome_modulo nome_pagina main test
11 40 teste /main/teste/teste.php 1 0
10 40 teste /test/teste/teste.php 0 1


But i want to ignore "/main" and "/test" in the columns "nome_pagina" and show only 1 row.

Something like this:

id tipo_acesso nome_modulo nome_pagina main test
11 40 teste /teste/teste.php 1 1

Answer

This should give the result you want:

SELECT      MAX(paginas_acesso.id) id
,           MAX(tipo_acesso) tipo_acesso
,           MAX(tipos_acesso.nome_modulo) nome_modulo
,           SUBSTRING(nome_pagina, 6, LEN(nome_pagina) - 5) nome_pagina
,           MAX(IF(nome_pagina LIKE '/main%', TRUE, FALSE)) AS main
,           MAX(IF(nome_pagina LIKE '/test%', TRUE, FALSE)) AS test
FROM        paginas_acesso
LEFT JOIN   tipos_acesso 
        ON  tipo_acesso = tipos_acesso.id
WHERE       tipo_acesso = 40
GROUP BY    SUBSTRING(nome_pagina, 6, LEN(nome_pagina) - 5) nome_pagina
ORDER BY    SUBSTRING(nome_pagina, 6, LEN(nome_pagina) - 5) ASC

By the way, it's good practice to use table aliases.