如何在一千列中的任何一列中选择与一个单独行匹配的所有行?

时间:2011-09-25 05:59:44

标签: mysql

例如,我的个性匹配数据库有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. 

1 个答案:

答案 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)。

转换你现在拥有的表结构将会有点乏味,但非常值得,并且通过明智地使用复制/粘贴可以减轻很多单调乏味。