2017-01-16 2 views
0

У меня есть запрос, который использует несколько левых объединений для возврата данных. Дилемма заключается в том, что я хочу LIMIT, а также ORDER BY результат одного из левых объединений и, таким образом, ограничение числа возвращаемых строк.MYSQL Ограничивающий запрос левого соединения

В таблице я пытаюсь сделать заказ и предел table4

Мой запрос:

SELECT SQL_CALC_FOUND_ROWS e.meta_1, a.requestid, b.clientid, c.job_description, d.forename 
FROM quotations_request AS a 

LEFT JOIN table1 AS b ON (a.assigned_to = b.userid) 
LEFT JOIN table2 AS c ON (a.job_costing = c.jobid) 
LEFT JOIN table3 AS d ON (a.clientid = d.clientid) 
LEFT JOIN table4 AS e ON (e.quotationid = a.requestid) 

WHERE a.archived = '0' AND (e.meta_1 = LCASE('requested')) 

Что я пробовал:

SELECT SQL_CALC_FOUND_ROWS statuss.meta_1, a.requestid, b.clientid, c.job_description, d.forename, 
FROM quotations_request AS a 

LEFT JOIN table1 AS b ON (a.assigned_to = b.userid) 
LEFT JOIN table2 AS c ON (a.job_costing = c.jobid) 
LEFT JOIN table3 AS d ON (a.clientid = d.clientid) 
LEFT JOIN (Select meta_1 from table4 where quotationid = a.requestid ORDER BY uploaded_date DESC LIMIT 0, 1) 
as statuss ON (statuss.quotationid = a.requestid) 

WHERE a.archived = '0' AND (statuss.meta_1 = LCASE('requested')) 

Результат:

После попытки выше я получил ошибку говоря a.requestid является Unkown в ИНЕКЕ (за исключением последнего соединения слева)

+3

И использование 'LIMIT' в подзапросе кажется разумным ... так что произошло дальше? –

+0

@TimBiegeleisen Извините, я должен был добавить (обновленный вопрос), а потом закончил с ошибкой, говорящей, что «a.requestid» - это поле unkown. помните, что a.requestid из основной таблицы во второй строке –

+0

Дилемма, описанная в вашем первом абзаце, не имеет ничего общего с ошибкой, которая мешает вашему запросу работать. Учитывая предикат, основанный на e.meta_l в вашем первом запросе, LEFT JOINs являются очень неэффективной избыточности и должны быть внутренними соединениями. – symcbean

ответ

0

Попробуйте это:

SELECT SQL_CALC_FOUND_ROWS statuss.meta_1, a.requestid, b.clientid, c.job_description, d.forename 
FROM quotations_request AS a 

LEFT JOIN table1 AS b ON (a.assigned_to = b.userid) 
LEFT JOIN table2 AS c ON (a.job_costing = c.jobid) 
LEFT JOIN table3 AS d ON (a.clientid = d.clientid) 
LEFT JOIN (
    select * 
    from (select 
      t.*, 
      @rn := if(quotationid = @qid, @rn + 1, 
       if(@qid := quotationid, 1, 1) 
      ) rn 
     from (
     select * 
     from table4 
     order by quotationid, uploaded_date desc) t cross join (
      select @rn := 0, @qid := -1 
     ) t2 
    ) t where rn = 1 
) 
as statuss ON (statuss.quotationid = a.requestid) 

WHERE a.archived = '0' AND (statuss.meta_1 = LCASE('requested')) 

Переменные пользователя @rn и @qid используются чтобы найти верхнюю 1 строку из таблицы4 с последним uploaded_date, а затем присоединить ее к другим таблицам

+0

Я получаю SQL-ошибку, сообщающую мне, чтобы я проверил руководство по' from webmanage_uploads order by quotationid, uploaded_date desc) t cros ' –

+0

это код, который я вставил из вашего ответа (с измененными именами полей, которые имеют для меня значение) , это выглядит правильно? https://codeshare.io/anzz7n –

+0

Я не могу получить доступ к вышеуказанному сайту. Я обновил свой ответ. можете ли вы попробовать это? в подзапросе – GurV

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