我有一个旧的数据库来重构并且面对这个表:
会员
import re
nameList = ['Boulder Highway and US 95 NB', 'Boulder Hwy and US 95 SB',
'Buffalo and Summerlin N', 'Charleston and I-215 W', 'Eastern and I-215 S', 'Flamingo and NB I-15',
'S Buffalo and Summerlin', 'Flamingo and SB I-15', 'Gibson and I-215 EB', 'I-15 at 3.5 miles N of Jean',
'I-15 NB S I-215 (dual)', 'I-15 SB 4.3 mile N of Primm', 'I-15 SB S of Russell', 'I-515 SB at Eastern W',
'I-580 at I-80 N E', 'I-580 at I-80 S W', 'I-80 at E 4TH St Kietzke Ln', 'I-80 East of W McCarran',
'LV Blvd at I-215 S', 'S Buffalo and I-215 W', 'S Decatur and I-215 WB', 'Sahara and I-15 East',
'Sands and Wynn South Gate', 'Silverado Ranch and I-15 (west side)']
dirMap = {'N': 'North', 'S': 'South', 'E': 'East', 'W': 'West'}
dirPattern = re.compile(r'[ ^]([NSEW])B?[ $]')
print('name\tmatch\tdirSting\tdirection')
for name in nameList:
match = dirPattern.search(name)
direction = None
dirString = None
if match:
dirString = match.group(1)
if dirString in dirMap:
direction = dirMap[dirString]
print('%s\t%s\t%s\t%s'%(name, match, dirString, direction))
作用
id | Name | Role
1 | Tyler | 6
2 | Jane | 16
3 | Jack | 20
首先,我感到困惑,因为成员表中的角色与角色表中的任何数据都不匹配。在分析了源代码后,我了解到这位程序员已经想出了自己的方法......
所选角色= 2 ^(角色等级)。
ie)杰克是会员&每月会员
杰克的角色= 2 ^(会员级别)+ 2 ^(每月会员级别)= 2 ^ 2 + 2 ^ 4 = 20.
嗯,这是我想做的。我将创建三个代表多对多关系的表。
会员
id | role | Level
1 | Visitor | 1
2 | Member | 2
3 | Monthly Member | 4
作用
id | Name
1 | Tyler
2 | Jane
3 | Jack
Member_Role
id | role
1 | Visitor
2 | Member
3 | Monthly Member
现在,我想选择所有成员并插入适当的member_id& rold_id到Member_Role表但不知道如何编码此查询。我的一般想法是......
member_id | role_id
1 | 1
1 | 2
3 | 2
重要的是我想根据条件手动插入值。这是因为我将重新排列角色的顺序,这个"选择的角色= 2 ^(角色级别)"公式将不再有效。因此,我更喜欢硬编码而不是通用。无论如何它是一次性使用代码...
谢谢!
答案 0 :(得分: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;
答案 1 :(得分: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)
答案 2 :(得分: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>';
}
}
?>