2015-07-19 105 views
0

后有条件插入我有一个旧的数据库重构和面临此表:MySQL的 - 选择查询

会员

id | Name | Role  
1 | Tyler |  6  
2 | Jane |  16  
3 | Jack |  20 

角色

id | role   | Level  
1 | Visitor   |  1  
2 | Member   |  2  
3 | Monthly Member |  4 

首先,我很困惑,因为角色在成员表中与角色表中的任何数据都不匹配。在分析源代码之后,我了解到这位程序员已经想出了他自己的方式...

所选角色= 2 ^(角色的级别)。

即)杰克是一个会员&每月会员

杰克的角色= 2 ^(构件电平)+ 2 ^(每月构件电平)= 2^2 + 2^4 = 20。


嗯,这是我想要做的。我将创建三个代表多对多关系的表格。

会员

id | Name  
1 | Tyler  
2 | Jane  
3 | Jack 

角色

id | role   
1 | Visitor  
2 | Member   
3 | Monthly Member 

Member_Role

member_id | role_id   
    1  | 1  
    1  | 2   
    3  | 2 

现在,我要选择所有成员,并插入相应的member_id & rold_id到Member_Role表,但不知道如何编码这个查询。我总的想法是这样的......

//Select all members from member table 
    //if role is 16 
     // insert his member id and monthly memberid to member_role table 
    //if role is 20 
     // insert his member id and member(role) id to member_role table 
     // insert his member id and monthly member id to member_role table 
    // and so on.... 

重要的是我想这取决于它的条件手动插入值。这是因为我将重新排列角色的顺序,并且这个“所选角色= 2 ^(角色的级别)”公式将不再起作用。因此,我更喜欢硬编码而不是通用编码。这是一次性使用代码无论如何...

谢谢!

+0

现实地说,在这之前有多少**实际**排列的旧数据是严重过度设计的,9? – Drew

+1

为什么2^2 + 4^2而不是2 + 4?我想我们永远不会知道。 – Strawberry

+0

@DrewPierce我找到了10种不同的组合。幸运的是,不足以手动编码它;) – Raccoon

回答

1

在那里,你要的丑陋做法的一个例子(非爱因斯坦的做法)

对于一个置换

create table oldstuff 
(
    id int not null, 
    yuck int not null 
); 

create table newstuff_junction 
(
    userId int not null, 
    roleId int not null 
); 

insert oldstuff (id,yuck) values (1,20),(2,20); 

insert newstuff_junction (userId,roleId) select id,2 from oldstuff where yuck=20; 
insert newstuff_junction (userId,roleId) select id,4 from oldstuff where yuck=20; 

select * from newstuff_junction order by userId,roleId; 

+--------+--------+ 
| userId | roleId | 
+--------+--------+ 
|  1 |  2 | 
|  1 |  4 | 
|  2 |  2 | 
|  2 |  4 | 
+--------+--------+ 
4 rows in set (0.00 sec) 
+0

啊,谢谢!提请皮尔斯的英雄! – Raccoon

+0

我很惭愧,甚至表明,在facepalm – Drew

+0

haha​​haha中间,现在我感到抱歉向你们展示这个老的'OMG'代码......无论如何感谢! – Raccoon

2

您可以使用按位“和”运算符来执行此操作。我希望下面进入比赛:

select m.*, r.* 
from member m join 
    role r 
    on (r.level & m.role) > 0; 

但是,你的例子是在暗示更多的东西一样:

from member m join 
    role r 
    on ((1 << r.level) & m.role) > 0; 

做一些调查,看看什么情况真的是。

插入新表格的逻辑有点复杂。假设你有一个new_roles表名称相同:

insert into member_roles(member_id, role_id) 
    select m.id, nr.id 
    from member m join 
     role r 
     on (r.level & m.role) > 0 join 
     new_roles nr 
     on nr.role = r.role; 

第一on条款可能是:

 on ((1 << r.level) & m.role) > 0; 
+0

听起来有点棘手,所以我会坚持更简单的方式;)但谢谢你你的建议! – Raccoon

1

你没有要求它,只是为了好玩,下面是使用原始数据集按位逻辑的PHP示例。

<?php 
//e.g.hostpath/bitfun.php?memberbit=6 

$input = $_GET['memberbit']; 

$member_types = array('visitor', 'monthly', 'monthly_member'); 

for($i=0; $i<count($member_types); $i++) { 
    $memberbit = pow(2,$i); 
    if($input & $memberbit) { 
     echo $member_types[$i] . '<br>'; 
    } 
} 

?> 
+0

现在我明白他正在试图做什么......他的方法似乎错了 – Raccoon