2016-11-25 62 views
-1

我有3个关于抱怨的表格。第一个表格由投诉信息本身组成,第二个表格是status_id的complain_review,第三个表格是状态信息的status_id表格。我试图从抱怨中选择抱怨_desc和抱怨_查看中的最新status_id(按日期desc排序),并将其与抱怨状态信息耦合起来。子查询和联接

这是我已经试过(没有成功至今):

SELECT c1.complain_desc, c2.status_id, c2.name as statusDesc from complain c1 
left join 
(SELECT c3.status_id, c4.name, c3.complain_id FROM complain_review c3 
inner join complain_status c4 on c4.id=c3.status_id ORDER by c3.date DESC) c2 
on c2.complain_id=c1.id 

这是@maheshiv

提供的最新例子。我已经经历了网站,但我不搜索“T确切地知道关于这件事情:(搜索哪些关键字

编辑:我在http://sqlfiddle.com/#!9/d86a7a/2建立一个架构,以便也许有人可以给需要在表更好看

编辑:也许这将是最接近的,因为我可以得到..和工作!

SELECT c.complain_desc, cr1.status_id, cs.name 
    FROM complain c 
    INNER JOIN complain_review cr1 ON c.id=cr1.complain_id 
    INNER JOIN complain_status cs ON cs.id=cr1.status_id 
    WHERE cr1.date = (SELECT MAX(cr2.date) FROM complain_review cr2 

WHERE cr1.complain_id = cr2.complain_id)

+0

,你能告诉我们的所有列名的所有3个表? – SaggingRufus

+0

请参阅http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-查询 – Strawberry

+0

第三表在哪里? – maheshiv

回答

-1

我想你可能需要此查询, 我相信最大STATUS_ID是投诉的最新状态。按照http://sqlfiddle.com/#!9/d86a7a/15

select c1.complain_desc, c2.status_id, c3.name from complain c1 inner join (select complain_id, max(status_id) from complain_review group by complain_id) c2 on c1.id=c2.complain_id inner join complain_status c3 on c3.id=c2.status_id; 
+0

错误..我只需要最新的status_id ...虽然我已经试过声明没有成功:( – Jeebsion

+0

它不工作。 。查询中没有任何内容:( – Jeebsion

+0

您能否向我解释您的要求是什么? 您的问题并不清楚 – maheshiv

1

我想选择(按日期倒序排序)从抱怨complain_desc和最新STATUS_ID从complain_review和夫妇与complain_status信息。

这是关于堆栈溢出的一个非常常见的问题。您可以按照找到许多解决方案。

下面是使用你的榜样的解决方案:

SELECT c.complain_desc, latest_cr.status_id, cs.name AS status_desc 
FROM complain AS c 
INNER JOIN (
    SELECT complain_id, status_id 
    FROM (
     SELECT cr.complain_id, cr.status_id, 
      IF(@cgroup=cr.complain_id, @rownum:[email protected]+1, 1) AS rownum, 
      (@cgroup:=cr.complain_id) 
     FROM (SELECT @cgroup:=0, @rownum:=1) AS _init 
     CROSS JOIN complain_review AS cr 
     ORDER BY cr.complain_id DESC, cr.date DESC 
    ) AS n 
    WHERE n.rownum = 1 
) AS latest_cr 
    ON c.id=latest_cr.complain_id 
INNER JOIN complain_status AS cs 
    ON cs.id = latest_cr.status_id; 

下面是一个使用子查询没有一个不同的解决方案:

SELECT c.complain_desc, cr1.status_id, cs.name AS status_desc 
FROM complain AS c 
INNER JOIN complain_review AS cr1 
    ON cr1.complain_id = c.id 
LEFT OUTER JOIN complain_review AS cr2 
    ON cr2.complain_id = c.id AND (cr2.date > cr1.date OR cr2.date = cr1.date AND cr2.id > cr1.id) 
INNER JOIN complain_status AS cs 
    ON cs.id = cr1.status_id 
WHERE cr2.id IS NULL; 
+0

OMG ..第一个解决方案似乎很复杂的使用'@cgroup'和'@rownum'等...我可以问你解释吗? – Jeebsion