当前位置: 首页 > 面试题库 >

MySQL LEFT JOIN重复结果

公羊安怡
2023-03-14
问题内容

我在实现一个模块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


问题答案:

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

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

边注:

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

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

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

问候。



 类似资料:
  • 钱箱类: 商户类: 输入数据: 我的任务 计算每个商家的总金额并返回商家列表 我正在尝试使用Stream API解决这个任务。并编写了以下代码: 结果 但显然,流返回四个对象,而不是所需的两个对象。我意识到,地图(第二行)为每个cashBoxId创建了四个对象。而且我不知道如何通过进行过滤,也不知道如何获得没有重复的结果。

  • for 重复结构处理计数器控制循环的所有细节。要演示for的功能,可以改写图2.16的程序,结果如图2.17。 执行for重复结构时,声明控制变量counter并将其初始化为1。然后检查循环条件counter<=10。由于counter的初始值为1,因此条件满足,打印Counter的值(1)。然后在表达式Counter++中递增控制变量counter,再次进行循环和测试循环条件。由于这时控制变量等

  • 重复结构(repetition strucure)使程序 员可以指定一定条件下可以重复的操作。下列伪代码语句: While there are more items on my shopping list Purchase next item and cross it off my list 描述购物过程中发生的重复。条件"there are more ltems on my shopping

  • 如何使随机数发生器不重复数字?我试过这个,但它总是重复给我数字

  • 问题内容: 我有一个使用TensorFlow创建多层感知器网络(带有辍学)的Python脚本,以进行二进制分类。即使我很小心地设置了Python和TensorFlow种子,我仍然得到了不可重复的结果。如果我运行一次然后再次运行,则会得到不同的结果。我什至可以运行一次,退出Python,重新启动Python,再次运行并获得不同的结果。 我尝试过的 我知道有人发布了有关在TensorFlow中获得不可

  • do/while重复结构与while结构相似。在while结构中,先在循环开头测试循环条件之后再执行循环体。do/while重复结构执行循环体之后再测试循环条件,因此,do/while结构至少执行循环体一次。do/while结构终止时,继续执行while语句后面的话句。注意,如果结构体中只有一条浯句,则不必在do/while结构中使用花括号。但通常还是加上花括号,避免棍淆while与do/whil