MySQL LEFT JOIN重复结果

Dev*_*oot 6 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'`
Run Code Online (Sandbox Code Playgroud)

我得到一个相同的项目返回两次,因为表中有2个匹配=project_categoryproject_id94

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);
Run Code Online (Sandbox Code Playgroud)

我错过了什么吗?

解决方案:使用GROUP BYDISTINCT

Seb*_*bas 9

不,这很好.这只是您想要使用DISTINCT关键字删除重复项的罕见情况之一.

在这种情况下,由于查询的逻辑是正确的,即使它返回多行,这也是合理的.很多时候,人们可以看到DISTINCT实际上查询逻辑错误的用法.

边注:

  • 您在WHERE子句中使用的任何过滤器,除了IS NULL/IS NOT NULLLEFT JOIN在同一个表引用上的任何内容转换为a之外INNER JOIN,对于最终结果集行为.(见:https://stackoverflow.com/a/15483895/1291428)
  • 你不应该用它GROUP BY来模拟效果DISTINCT,原因有两个:

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

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

问候.