2012-10-08 98 views
1

所以我有一个比较复杂的MySQL查询时给人一种重复列,原因我一直没能确定。我对SQL有点新鲜。重复列名称JOIN

查询应该参加的以“门票”专为特定id的最新车票的数据库“问题”项目列表。因此,我有一个内部查询,它自己执行ticket表的JOIN以获取最新的票证。这工作正常。然后我试图JOIN这个内侧选择与problem数据库,但是,我得到了重复的列名id,尽管这是列名,我就加入。我的理解是,当你在一个特定的列加入,它不应该“算”为重复...

反正查询:

SELECT * FROM `problem` P 
LEFT JOIN (
    SELECT * FROM (
     SELECT id, MAX(ticket_id) AS ticket_id 
     FROM `ticket` 
     WHERE ticket_status = 'o' 
     GROUP BY id 
    ) AS MAX 
    INNER JOIN (
     SELECT id, ticket_id, other_data, time_stamp FROM `ticket` 
    ) CUR ON MAX.id = CUR.id AND MAX.ticket_id = CUR.ticket_id 
) T ON P.id=T.id 
WHERE 
     P.since IS NOT NULL; 

正如我所说的,如果我这样做只是这一点:

SELECT * FROM (
    SELECT id, MAX(ticket_id) AS ticket_id 
    FROM `ticket` 
    WHERE ticket_status = 'o' 
    GROUP BY id 
) AS MAX 
INNER JOIN (
    SELECT id, ticket_id, other_data, time_stamp FROM `ticket` 
) CUR ON MAX.id = CUR.id AND MAX.ticket_id = CUR.ticket_id 

我得到了每个id最新票的表。

我试图解决这个问题的一件事是SELECT MAX.* FROM (而不仅仅是SELECT * FROM (。这消除了重复的列名错误,但内部查询不再返回任何other_datatime_stamp –我只得到idticket_id列。当然,这首先破坏了加入的目的。

回答

1

别名id列如下:

SELECT * FROM `problem` P 
LEFT JOIN (
    SELECT * FROM (
     SELECT id AS max_id, MAX(ticket_id) AS ticket_id 
     FROM `ticket` 
     WHERE ticket_status = 'o' 
     GROUP BY max_id 
    ) AS MAX 
    INNER JOIN (
     SELECT id AS cur_id, ticket_id, other_data, time_stamp FROM `ticket` 
    ) CUR ON MAX.max_id = CUR.cur_id AND MAX.ticket_id = CUR.ticket_id 
) T ON P.id=T.max_id 
WHERE 
     P.since IS NOT NULL; 

我的评论,你可以只选择需要的列,以避免重复和作者明白我的问题写意思是外部选择,我在谈论内部选择。希望我写得对,没有测试。

SELECT * FROM `problem` P 
LEFT JOIN (
    SELECT CUR.id, CUR.ticket_id, CUR.other_data, CUR.time_stamp FROM (
     SELECT id, MAX(ticket_id) 
     FROM `ticket` 
     WHERE ticket_status = 'o' 
     GROUP BY max_id 
    ) AS MAX 
    INNER JOIN (
     SELECT id, ticket_id, other_data, time_stamp FROM `ticket` 
    ) CUR ON MAX.max_id = CUR.cur_id AND MAX.ticket_id = CUR.ticket_id 
) T ON P.id=T.id 
WHERE 
     P.since IS NOT NULL; 
+0

由于'INNER JOIN',我相当肯定'max_id'和'cur_id'将永远是完全相等的,因此我可以检查两者之一。当然,在我的测试中似乎是这样。非常感谢! – KRyan

+0

@KRyan这是正确的,并没有真正把所有的东西想进去,想回答快速,发生在我身上好几次最近,有人张贴快一点。在这种情况下,你应该删除其中一个条件,更新答案。你也不应该在连接内选择*,而只需要实际需要的最少数量的列,也可以删除重复的ID列并使查询速度更快。 – xception

+0

我敢肯定的'SELECT *,因为我来自一个子查询只返回列我真正感兴趣的选择'是好的。我当然不会让* *不是'id'多列,'TICKET_ID ','other_data'和'time_stamp',即使我输出原始结果。 – KRyan

1

尝试使用AS为加入的查询中的所有列别名,就像您为MAX(ticket_id)字段所做的那样。

如:

INNER JOIN (
    SELECT id AS cur_id, ticket_id as cur_ticket_id ... etc 
+0

我相信你实际上需要为inner-inner select和Inner Join部分这么做,因为你从每个列中都得到了一个'id'列。 – KRyan