Mysql is a more efficient way to query

the work is done below, but I feel like I am breaking the rules of programming.

select *
from serverTable
where server like ‘proc1@server1’
order by reg_date desc
limit 1
union
select *
from serverTable
where server like ‘proc2@server1’
order by reg_date desc
limit 1
union
select *
from serverTable
where server like ‘proc3@server1’
order by reg_date desc
limit 1
union
select *
from serverTable
where server like ‘pro4@server1’
order by reg_date desc
limit 1
union
select *
from serverTable
where server like ‘proc5@server1’
order by reg_date desc
limit 1

Is there a better way or the right way to do this?

+4
source share
3 answers

One option is to find the maximum reg_datefor each group server, where it servercan take one of the 5 values ​​in your query UNION, and then select the complete records from your table for each server.

SELECT t1.*
FROM serverTable t1
INNER JOIN
(
    SELECT server,
           MAX(reg_date) AS reg_date
    FROM serverTable
    WHERE server in ('proc1@server1', 'proc2@server1', 'proc3@server1', 'proc4@server1', 'proc5@server1')
    GROUP BY server
) t2
    ON t1.server = t2.server AND
       t1.reg_date = t2.reg_date
+1
source

UNION ALL, UNION. UNION, , . UNIONed WHERE "server like (some unique value)". server , .

, = like. like , , .

0

Something like this should do this:

select
  serverTable.col1,
  serverTable.col2,
  serverTable.col3,
  max(reg_date)
from
  serverTable
where
  server in ('proc1@server1','proc2@server1','proc3@server1','proc4@server1','proc5@server1')
group by
  serverTable.col1,
  serverTable.col2,
  serverTable.col3
order by
  server, reg_date;
0
source

Source: https://habr.com/ru/post/1651566/


All Articles