我在实现一个模块project可以属于多个模块时遇到问题categories。示例:项目“ PHP Programmer”属于以下类别:编程,PHP。
project
categories
假设以下查询( 选择属于类别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
project_category``project_id``94
表projects_category架构:
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或DISTINCT
GROUP BY
DISTINCT
不,这很好。这只是您想使用DISTINCT关键字删除重复项的极少数情况之一。
在这种情况下,即使查询返回的行多,该逻辑也是正确的,这是有道理的。很多时候可以看到DISTINCT查询逻辑错误时的用法。
边注:
WHERE
IS NULL/IS NOT NULL
LEFT JOIN
INNER JOIN
1 /这不是目的。的作用之一GROUP BY是消除重复项,但其主要目的是根据一组特定的条件对行进行分组,以便对其进行一些分析计算/运算。
2 /GROUP BY还有ORDERBY结果(在mysql中),这不一定是您想要的结果,在这种情况下会减慢执行速度。请确保正确使用引擎提供的功能,从前向兼容性的角度来看,这总是更好的选择。(预期您所包括的内容实际上不是)
ORDERBY
问候。