Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

FIltering result from query

Tags:

sql

mysql

This query return users from database MariaDB (MySql). I need to remove rows from result, where in surname is added "(old)" OR "- R". How to edit a query?

SELECT au.id,
       au.name,
       au.surname
FROM statements s 
JOIN aduser au ON au.id=s.id_usp
WHERE s.id_utv = 10
GROUP BY au.surname
ORDER BY au.surname ASC

From this result of query:

id name surname
124 Mike Argle
221 Mike Argle (old)
138 Lisa Doe
126 Lisa Doe (old)
123 John Harris
135 John Harris - R
324 Ann Perez
329 Tiffani Perez

To this result. Query should return this result:

id name surname
124 Mike Argle
138 Lisa Doe
123 John Harris
324 Ann Perez
329 Tiffani Perez
like image 568
Elo Avatar asked Oct 18 '25 02:10

Elo


1 Answers

You can use a ROW_NUMBER window function to select the first value among the name + ' - R'/' (old)' doubled values.

WITH cte AS (
    SELECT *, ROW_NUMBER() OVER(
                  PARTITION BY name, surname REGEXP name+' (- R|(old))'  
                  ORDER BY surname) AS rn
    FROM tab
)
SELECT id, name, surname
FROM cte
WHERE rn = 1

Check the demo here.


Your query would get updated as such:

WITH cte AS (
    SELECT au.id,
           au.name,
           au.surname,
           ROW_NUMBER() OVER(
               PARTITION BY au.name, au.surname REGEXP au.name+' (- R|(old))'  
               ORDER BY au.surname) AS rn
    FROM statements s 
    JOIN aduser au ON au.id=s.id_usp
    WHERE s.id_utv = 10
)
SELECT id, name, surname
FROM cte
WHERE rn = 1
ORDER BY surname ASC

like image 54
lemon Avatar answered Oct 19 '25 16:10

lemon



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!