MySQL查询 - 加入问题

时间:2013-03-17 03:08:17

标签: mysql join left-join

我有以下查询,它会多次重复返回所有相同的行。

我需要加入2个表:注释和项目对象,但无论我尝试哪种方式,行都会重复多次。

以下是当前查询:

SELECT 
acx_comments.created_on AS 'Time',
acx_project_objects.created_by_id AS `Created By`,  
acx_comments.body AS `Comment`,
concat("http://www.example.com/projects/" , acx_project_objects.project_id , "/tasks/" , acx_project_objects.integer_field_1 ) AS URL
FROM acx_comments, acx_project_objects
LEFT JOIN acx_comments v
ON v.parent_id = acx_project_objects.id 
WHERE acx_comments.id > 1500 AND acx_comments.id <= 1575
ORDER BY acx_comments.created_on DESC

目前的结果如下:

时间/创建人/评论/网址

15:35:34 / 1 /测试评论X / URLx

15:35:34 / 1 /测试评论X / URLx

15:35:34 / 1 /测试评论X / URLx

15:35:34 / 1 /测试评论X / URLx

15:35:34 / 1 /测试评论X / URLx

15:35:34 / 1 /测试评论X / URLx

15:35:34 / 1 /测试评论X / URLx

如您所见 - 它多次打印相同的注释。

我知道这是因为acx_comments.parent_id在连接到acx_project_objects.id时有很多重复 - 有很多注释具有相同的父ID,因为每个父级可以有多个注释...但我只想按日期顺序打印一次评论。

我无法找出正确的Join方法,只能打印每个评论一次。上面的代码没有给我按日期排序的评论列表(仅限唯一)。

任何建议都会受到赞赏,因为我花了几个小时才解决这个问题。

谢谢!

BTW - 我必须使用项目对象表,因为它需要构造URL地址(参见concat函数)。如果您认为我应该删除该表 - 这是不可能的

2 个答案:

答案 0 :(得分:2)

FROM acx_comments, acx_project_objects
LEFT JOIN acx_comments v
ON v.parent_id = acx_project_objects.id 

您在技术上两次加入acx_comments。 WHERE子句不包含任何JOIN条件,ON子句中的JOIN条件仅适用于LEFT JOIN中指定的“acx_comments v”。

我对正在发生的事情的猜测是,您在acx_comments和acx_project_objects之间创建了一个笛卡尔积,因为它们在WHERE中没有JOIN条件,以逗号分隔。然后你再次加入acx_comments混乱。

重写你的FROM和LEFT JOIN,这样每个表只列出一次,并给它一个镜头。

SELECT 
v.created_on AS 'Time',
o.created_by_id AS `Created By`,  
v.body AS `Comment`,
concat("http://www.example.com/projects/" , o.project_id , "/tasks/" , o.integer_field_1 ) AS URL
FROM acx_comments v
LEFT JOIN acx_project_objects o
ON v.parent_id = o.id 
WHERE v.id > 1500 AND v.id <= 1575
ORDER BY v.created_on DESC

答案 1 :(得分:1)

您可以尝试在评论ID上使用MySQL的GROUP BY

SELECT 
  acx_comments.created_on 'Time',
  acx_project_objects.created_by_id 'Created By',  
  acx_comments.body 'Comment',
  concat("http://www.example.com/projects/" , acx_project_objects.project_id , "/tasks/" , acx_project_objects.integer_field_1 ) 'URL'
FROM acx_comments, acx_project_objects
LEFT JOIN acx_comments v ON v.parent_id = acx_project_objects.id 
WHERE acx_comments.id > 1500 AND acx_comments.id <= 1575
GROUP BY acx_comments.id
ORDER BY acx_comments.created_on DESC