我在实施模块时遇到问题,其中一个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
答案 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 BY
也ORDER 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”可防止重复形成。