【发布时间】:2013-12-19 01:32:38
【问题描述】:
我有四个表如下:
CREATE TABLE IF NOT EXISTS `categories` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(255) NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `categories_friends` (
`category_id` int(10) unsigned NOT NULL,
`friend_id` int(10) unsigned NOT NULL,
UNIQUE KEY `category_id` (`friend_id`,`category_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
CREATE TABLE IF NOT EXISTS `friends` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`friend_id` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_id` (`user_id`,`friend_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
CREATE TABLE IF NOT EXISTS `ratings` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL,
`category_id` int(10) unsigned NOT NULL,
`title` varchar(255) NOT NULL,
`description` text NOT NULL,
`rating` tinyint(2) unsigned NOT NULL,
`public` tinyint(1) NOT NULL DEFAULT '0',
`created` datetime NOT NULL,
PRIMARY KEY (`id`),
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;
我正在尝试对这些表执行以下查询:
SELECT *
FROM `favred`.`ratings` AS `Rating`
INNER JOIN `favred`.`friends` AS `JFriend`
ON (`JFriend`.`friend_id` = `Rating`.`user_id`)
INNER JOIN `favred`.`categories_friends` AS `JCategoriesFriend`
ON (`JCategoriesFriend`.`category_id` = `Rating`.`category_id`
AND `JCategoriesFriend`.`friend_id` = `JFriend`.`id`)
INNER JOIN `favred`.`categories` AS `JCategory`
ON (`JCategory`.`id` = `Rating`.`category_id`
AND `JCategory`.`id` = `JCategoriesFriend`.`category_id`)
WHERE `JFriend`.`user_id` = 1
AND `Rating`.`user_id` <> 1
AND `JCategory`.`id` IN (4, 14)
GROUP BY `Rating`.`id`
上面的查询不起作用,因为它没有返回任何结果(尽管表中有应该返回的数据),我想要做的是找到所有不是我创作的评级(ID: 1),但由我的朋友创作,但前提是我已选择查看该朋友的特定类别,结果集由给定的特定类别集过滤。
INNER JOIN 循环通过 Rating --> Friend --> CategoriesFreind --> Category --> 返回到 Rating。
如果我删除 INNER JOIN 的 ON 子句的附加部分,如下所示:
SELECT *
FROM `favred`.`ratings` AS `Rating`
INNER JOIN `favred`.`friends` AS `JFriend`
ON (`JFriend`.`friend_id` = `Rating`.`user_id`)
INNER JOIN `favred`.`categories_friends` AS `JCategoriesFriend`
ON (`JCategoriesFriend`.`friend_id` = `JFriend`.`id`)
INNER JOIN `favred`.`categories` AS `JCategory`
ON (`JCategory`.`id` = `JCategoriesFriend`.`category_id`)
WHERE `JFriend`.`user_id` = 1
AND `Rating`.`user_id` <> 1
AND `JCategory`.`id` IN (4, 14)
GROUP BY `Rating`.`id`
然后查询将返回结果,但是因为将 CategoriesFriend 加入到 Rating 的 INNER JOIN 没有被 'JCategory'.'id' IN (4, 14) 子句过滤,所以它返回该朋友的所有 Ratings,而不是应有的过滤。
关于如何修改我的查询以获取过滤结果的任何建议?
而且我使用的是 CakePHP,因此尽管不是必需的,但最好使用适合其独特查询格式的查询。
【问题讨论】:
-
+1 提出 SQL 问题并将架构和查询放入其中的人! :-)
-
您认为必不可少的。
-
你想要什么样的输出?
-
@AgoengLauw,为简洁起见,我剪掉了
SELECT的一些部分,但基本上,它会提取适合过滤器的评级条目。因此,如果有帮助,您可以将SELECT *替换为SELECT 'Rating'.*。
标签: mysql cakephp inner-join