2017-02-22 2 views
1

MySQL запрашивает выбор из двух последних записей с конкретным полем значений.SQL-запрос для выбора из таблицы двух последних записей с определенным полем для каждого элемента

Привет, люди. Мои знания SQL недостаточно, поэтому я прошу вас помочь. У меня есть таблица с единицами и таблица с единичными услугами unit_service

id  unit_id date   mileage type 
1  2  2000-12-01  1000  6 
2  3  2000-07-07  1000  7 
3  2  2000-07-01  1000  6 
4  3  2000-08-03  1000  6 
5  3  2000-08-03  1000  7 
6  3  2000-08-04  1000  8 
7  2  2000-08-04  1000  6 

и так далее ... тип типа сервиса.

Я хочу получить список единиц с двумя последними датами для каждого типа обслуживания и распечатать его затем в таблице. На данный момент, я построить этот запрос

SELECT 
    u.unit_number, us.mileage, us.type, us.date 
FROM 
    units AS u 
LEFT JOIN 
    units_service AS us ON (u.id = us.unit_id) 
WHERE 
    (us.id = (SELECT us2.id 
       FROM units_service AS us2 
       WHERE us2.unit_id=us.unit_id AND us2.type = 6 
       ORDER BY us2.date DESC LIMIT 1) 
    OR us.id = (SELECT us2.id 
       FROM units_service AS us2 
       WHERE us2.unit_id=us.unit_id AND us2.type = 6 
       ORDER BY us2.date DESC LIMIT 1,1) 
    OR us.id = (SELECT us2.id 
       FROM units_service AS us2 
       WHERE us2.unit_id=us.unit_id AND us2.type = 7 
       ORDER BY us2.date DESC LIMIT 1) 
    OR us.id = (SELECT us2.id 
       FROM units_service AS us2 
       WHERE us2.unit_id=us.unit_id AND us2.type = 7 
       ORDER BY us2.date DESC LIMIT 1,1) 
    OR us.id = (SELECT us2.id 
       FROM units_service AS us2 
       WHERE us2.unit_id=us.unit_id AND us2.type = 8 
       ORDER BY us2.date DESC LIMIT 1)) 
    OR us.id = (SELECT us2.id 
       FROM units_service AS us2 
       WHERE us2.unit_id=us.unit_id AND us2.type = 8 
       ORDER BY us2.date DESC LIMIT 1,1) 
    AND u.unit_company = :unit_company 
    AND u.unit_type = :unit_type 
ORDER BY us.unit_id 

Является ли это запрос плохо или хорошо? Есть еще один запрос или несколько запросов, что лучше для этого? Или, может быть, вы думаете, что лучше использовать некоторые другие таблицы?

С уважением.

+0

'LIMIT 2, 1' получает первый и третий период. Я думаю, вы имеете в виду 'LIMIT 1, 1'. –

+0

@GordonLinoff Спасибо, да, вы правы, моя ошибка. Я исправлю это. –

+0

Можете ли вы предоставить желаемый результат – Strawberry

ответ

0

Это работает? Это решает проблему в одном условии:

WHERE us.id = ANY (SELECT us2.id 
        FROM units_service us2 
        WHERE us2.unit_id = us.unit_id AND us2.type = us.type 
        ORDER BY us2.date DESC 
        LIMIT 2 
       ) 

(. Я не пробовал ANY с подзапроса, который имеет LIMIT в MySQL, я знаю, IN не работает в Mysql - хотя он работает в других базах данных)

Если выше не работает следующим инструкциям:

WHERE us.id = (SELECT us2.id 
       FROM units_service us2 
       WHERE us2.unit_id= us.unit_id AND us2.type = us.type 
       ORDER BY us2.date DESC 
       LIMIT 1 
      ) OR 
     us.id = (SELECT us2.id 
       FROM units_service us2 
       WHERE us2.unit_id = us.unit_id AND us2.type = us.type 
       ORDER BY us2.date DESC 
       LIMIT 1, 1 
      ) 
+0

Это левое соединение, а «мы» - с правой стороны. Вышеупомянутое должно быть частью объединения, а не предложения where. – GurV

+0

К сожалению, я пробовал (ЛЮБОЙ) и имел _This версия MySQL еще не поддерживает «LIMIT & IN/ALL/ANY/SOME subquery» (версия сервера MySQL: 5.7.17) –

+0

Я сделал небольшую модификацию во втором кода, и теперь он работает правильно. –

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