Mysql - 选择查询后的条件插入

时间:2015-07-19 16:10:26

标签: mysql sql

我有一个旧的数据库来重构并且面对这个表:

会员

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 ^(角色级别)"公式将不再有效。因此,我更喜欢硬编码而不是通用。无论如何它是一次性使用代码...

谢谢!

3 个答案:

答案 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>';
    }
}

?>