MYSQL限制左连接查询

MYSQL限制左连接查询,mysql,left-join,sql-order-by,limit,Mysql,Left Join,Sql Order By,Limit,我有一个查询,它使用一些左连接来返回数据。进退两难的是,我想限制,还想按排序左联接之一的结果,从而限制返回的行总数 我试图订购和限制的表格是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

我有一个查询,它使用一些左连接来返回数据。进退两难的是,我想
限制
,还想
排序左联接之一的结果,从而限制返回的行总数

我试图订购和限制的表格是
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') )
我尝试过的:

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') )
结果:

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') )
尝试上述操作后,我发现一个错误,即where子句中的
a.requestid
未知(对于最后一个左连接)

尝试以下操作:

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用于从表4中找到最新上传日期的前1行,然后将其与其他表连接起来

,并且在子查询中使用
LIMIT
,这似乎是合理的……那么接下来会发生什么呢?@TimBiegeleisen抱歉,我应该添加(更新的问题)我最后的错误是“a.requestid”这是一个未知领域。记住a.requestid来自第二行的主表第一段中描述的困境与阻止查询运行的错误无关。在您的第一个查询中给定基于e.meta_l的谓词,左连接是一种非常低效的冗余,应该是内部连接。。。其中e与内连接e相同。此外,使用区分大小写的排序规则也不常见。只需说“我收到一个SQL错误,告诉我检查手册”来自webmanage“按quotationid上传订单,上传日期描述)t cros”这是我从您的答案中粘贴的代码(带有与我相关的修改字段名),它看起来正确吗?我无法访问上述网站。我已经更新了我的答案。你能试试吗?子问题中缺少了一个
*
“有一天我能像你一样吗?@jimmyturner过早的神化和过早的优化一样糟糕;-)