2016-08-17 4 views
4

ниже выполняет свою работу, но я чувствую, что нарушаю правила программирования.mysql более эффективный способ запроса

select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 
union 
select * 
from serverTable 
where server like ‘[email protected]’ 
order by reg_date desc 
limit 1 

Есть ли лучший способ или правильный способ сделать это?

ответ

0

ИСПОЛЬЗОВАНИЕ UNION ALL, а не UNION. Используя UNION, база данных без необходимости ищет дубликаты, которых не существует. Все ваши UNIONed-запросы включают в себя предложение WHERE типа «сервер (например, уникальное значение)». server не может быть больше, чем один из них, поэтому у вас не будет дубликатов для фильтрации.

Кроме того, используйте = вместо like. LIKE используется, когда вы хотите выполнить поиск по шаблону, который вы не делаете.

1

Одним из вариантов были бы найти максимальный reg_date для каждой server группы, где server может принимать одно из 5 значений в UNION запросе, а затем выберите полные записи из таблицы для каждой группы server.

SELECT t1.* 
FROM serverTable t1 
INNER JOIN 
(
    SELECT server, 
      MAX(reg_date) AS reg_date 
    FROM serverTable 
    WHERE server in ('[email protected]', '[email protected]', '[email protected]', '[email protected]', '[email protected]') 
    GROUP BY server 
) t2 
    ON t1.server = t2.server AND 
     t1.reg_date = t2.reg_date 
+0

25 сек до конца:/ –

0

Что-то вроде этого следует сделать это:

select 
    serverTable.col1, 
    serverTable.col2, 
    serverTable.col3, 
    max(reg_date) 
from 
    serverTable 
where 
    server in ('[email protected]','[email protected]','[email protected]','[email protected]','[email protected]') 
group by 
    serverTable.col1, 
    serverTable.col2, 
    serverTable.col3 
order by 
    server, reg_date; 
+0

извините, у меня не было возможности посмотреть на это. но сегодня вечером и вернемся к этому – user3502374

Смежные вопросы