小编典典

MySQL LEFT JOIN重复结果

sql

我在实现一个模块project可以属于多个模块时遇到问题categories。示例:项目“ PHP
Programmer”属于以下类别:编程,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'`

我得到一个 同一个项目返回了两次 ,因为表中有==的 2个 匹配项project_category``project_id``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 BYDISTINCT


阅读 201

收藏
2021-05-05

共1个答案

小编典典

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

在这种情况下,即使查询返回的行多,该逻辑也是正确的,这是有道理的。很多时候可以看到DISTINCT查询逻辑错误时的用法。

边注:

  • WHERE除了最终结果集的行为外,您在子句中使用的表引用上的任何过滤器IS NULL/IS NOT NULL都将使LEFT JOIN该同一表引用上的任何过滤器转向,而不是其他过滤器INNER JOIN
  • 您不应使用GROUP BY来模拟的效果DISTINCT,原因有两个:

1 /这不是目的。的作用之一GROUP BY是消除重复项,但其主要目的是根据一组特定的条件对行进行分组,以便对其进行一些分析计算/运算。

2 /GROUP BY还有ORDERBY结果(在mysql中),这不一定是您想要的结果,在这种情况下会减慢执行速度。请确保正确使用引擎提供的功能,从前向兼容性的角度来看,这总是更好的选择。(预期您所包括的内容实际上不是)

问候。

2021-05-05