2015-07-19 99 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