MySQL LEFT JOIN重复结果

时间:2012-07-10 15:00:36

标签: mysql sql left-join

我在实施模块时遇到问题,其中一个project可以属于多个categories。示例:project“PHP Programmer”所属分类:Programming,PHP。

假设以下查询(选择属于类别1,3,11 的项目):

SELECT projects.* FROM projects 
    LEFT JOIN pojects_category on projects.id = pojects_category.project_id 
    WHERE pojects_category.category_id IN (1,3,11) and projects.id='94'`

我得到了同一个项目返回两次,因为project_category表中有{strong> 2 匹配project_id = {{1 }}

94架构:

projects_category

我错过了什么吗?

解决方案:使用CREATE TABLE IF NOT EXISTS `pojects_category` ( `project_id` int(10) NOT NULL, `category_id` int(10) NOT NULL, KEY `category_id` (`category_id`), KEY `project_id` (`project_id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8; INSERT INTO `pojects_category` (`project_id`, `category_id`) VALUES (94, 3), (94, 1); GROUP BY

2 个答案:

答案 0 :(得分:9)

不,这很好。这只是您想要使用DISTINCT关键字删除重复项的极少数情况之一。

在这种情况下,这可以通过查询逻辑正确的事实来证明,即使它返回多行。很多时候,当查询的逻辑错误时,可以看到DISTINCT的用法。

旁注:

  • 您在WHERE子句IS NULL/IS NOT NULL以外使用的表引用上的任何过滤器都会使同一个表引用上的任何LEFT JOIN变为INNER JOIN,至于最终的结果集行为。 (见:https://stackoverflow.com/a/15483895/1291428
  • 您不应使用GROUP BY来模拟DISTINCT的效果,原因有二:

    1 /这不是目的。 GROUP BY的一个影响是消除重复,但其主要目的是根据一组标准对行进行分组,以便对它们应用一些分析计算/操作。

    2 / GROUP BYORDER BY结果(在mysql中),这不一定是你想要的,在这种情况下会减慢执行速度。请确保适当使用引擎提供的内容,从前向兼容性的角度来看,这总是更好。 (预计你所包含的内容实际上并非如此)

问候。

答案 1 :(得分:0)

您也可以将其重写为“IN”以绕过重复项:

SELECT projects.*
FROM projects      
where projects.id in (select project_id
                      from projects_category
                      WHERE pojects_category.category_id IN (1,3,11)
                     ) and
      projects.id='94'

当您使用连接过滤记录时,“in”可防止重复形成。