例如,我的个性匹配数据库有1000列,其中包括类型标题:
autoid | movie_genre_comedy | movie_genre_action | movie_genre_horror | more genres -->
23432 | 1 | 0 | 1 | 0
3241 | 0 | 1 | 1 | 0
64323 | 0 | 1 | 0 | 0
如何使用autoid 23432将每一行与行匹配,以便生成下表:
autoid | movie_genre_comedy | movie_genre_action | movie_genre_horror | more genres -->
23432 | 1 | 0 | 1 | 0
3241 | 0 | 1 | 1 |
请注意,autoid 64323的行不存在,因为它与autoid 23432的所选行没有任何类似的列。
最简单的方法是:
SELECT *
from genretable
WHERE movie_genre_comedy = 1
OR movie_genre_horror = 1
OR ........... and so on for up to 1000 parameters.
答案 0 :(得分:1)
您在问题中提到的代码实际上是用您当前的表结构执行的唯一方法。答案是创建两个新表来将用户映射到个性特征,如下所示:
create table `personality_trait_values`
(
`id` smallint auto_increment primary key
,`value` varchar(20) not null unique
);
create table `personality_traits`
(
`user_id` int not null references `users` (`autoid`)
,`personality_trait_id` int not null references `personality_trait_values` (`id`)
,unique (`user_id`,`personality_trait_id`)
);
有了这个,您可以核对描述用户是否具有个性特征的1000列,并且您的查询变得更加紧凑:
select u.`autoid`
from `personality_traits` pt1
join `personality_traits` pt2
on pt1.`personality_trait_id` = pt2.`personality_trait_id`
and pt1.`user_id` != pt2.`user_id`
where pt1.`user_id` = `v_user_id_to_compare_to`
其中v_user_id_to_compare_to是您之前在存储过程中设置的变量(如果是您的问题,则为23432)。
转换你现在拥有的表结构将会有点乏味,但非常值得,并且通过明智地使用复制/粘贴可以减轻很多单调乏味。