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 BY或DISTINCT
不,这很好.这只是您想要使用DISTINCT关键字删除重复项的罕见情况之一.
在这种情况下,由于查询的逻辑是正确的,即使它返回多行,这也是合理的.很多时候,人们可以看到DISTINCT实际上查询逻辑错误的用法.
边注:
WHERE子句中使用的任何过滤器,除了IS NULL/IS NOT NULL将LEFT JOIN在同一个表引用上的任何内容转换为a之外INNER JOIN,对于最终结果集行为.(见:https://stackoverflow.com/a/15483895/1291428)你不应该用它GROUP BY来模拟效果DISTINCT,原因有两个:
1 /这不是目的.其中一个影响GROUP BY是消除重复,但其主要目的是根据一组标准对行进行分组,以便对它们应用一些分析计算/操作.
2/GROUP BY还ORDER BY的结果(在MySQL),这是不necessarly你想要什么,在这种情况下减慢执行.请确保适当使用引擎提供的内容,从向前兼容性的角度来看,这总是更好.(预计你所包含的内容实际上并非如此)
问候.
| 归档时间: |
|
| 查看次数: |
8357 次 |
| 最近记录: |