Mysql 在相当复杂的联接中重复列名

Mysql 在相当复杂的联接中重复列名,mysql,join,duplicates,Mysql,Join,Duplicates,所以我有一个相对复杂的MySQL查询,它给出了一个重复的列,原因我无法确定。我对SQL有些陌生 该查询应该将“问题”条目列表与“票证”数据库连接起来,特别是特定id的最新票证。因此,我有一个内部查询,它在自身上执行ticket表的JOIN,以获取最新的ticket。这是正确的。然后我尝试将这个内部选择与问题数据库连接起来,但是,我得到了一个重复的列名id,尽管这是我要连接的列名。我的理解是,当你加入一个特定的列时,它不应该被“计算”为重复 无论如何,查询: SELECT * FROM `prob

所以我有一个相对复杂的MySQL查询,它给出了一个重复的列,原因我无法确定。我对SQL有些陌生

该查询应该将“问题”条目列表与“票证”数据库连接起来,特别是特定
id
的最新票证。因此,我有一个内部查询,它在自身上执行
ticket
表的
JOIN
,以获取最新的ticket。这是正确的。然后我尝试
这个内部选择与
问题
数据库连接起来,但是,我得到了一个重复的列名
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
的最新票证表


我试图解决的一件事是
从(
选择MAX.*FROM),而不仅仅是
从中选择*FROM(
。这消除了重复的列名错误,但内部查询不再返回任何
其他数据
时间戳
–我只得到
id
ticket\u id
列。当然,这首先破坏了联接的目的。

尝试为联接查询中的所有列提供一个alias使用
作为
,就像您对
MAX(ticket\u id)
字段所做的那样

例如:


将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;

我相信您实际上需要对内部select和内部Join部分都这样做,因为您从每个部分获得一个
id
列。由于
内部Join
,我可以合理地确定
max_id
cur_id
始终是完全相等的,因此我可以检查其中一个。当然可以看到在我的测试中就是这样的。非常感谢!@KRyan说得对,我并没有花太多心思,想快速回答,最近有好几次我遇到有人发了更快的帖子。在这种情况下,你应该删除其中一个条件,更新答案。你也不应该在加入中选择*而只是一个最小的麻木对于您实际需要的列,可能还会删除重复的id列,使您的查询速度更快。我非常确定
SELECT*
很好,因为我从只返回我实际感兴趣的列的子查询中进行选择。我当然不会得到比
id
ticket\u id
更多的列e> 其他数据和时间戳,即使我输出原始结果。
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;