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