0

現在、私は 3 つの MySQL テーブルを持っています。1 つはユーザー情報、もう 1 つはコース履歴、最後の 1 つは報酬履歴です。

この 2 つのデータベースと PHP スクリプトを使用して、「報酬」プログラムを作成しようとしています。報酬の要件に関しては、2 種類の報酬用に 2 つの配列をセットアップしています。

//Pen Reward with course A & B required
$pen=array("a","b")

//Cup Reward with course B & C required
$cup=array("b","c")

最初にすべてのユーザー ID を照会してから、その履歴を調べる方法がわかりません。上記の要件に一致する場合は、報酬テーブルを 1 に更新します (報酬を受け取ったことを示すため)。

ユーザーDB

userid    name
----------------
1         bill
2         john
3         steve

履歴DB

userid    courseid
------------------
1         a
1         b
2         b
3         a
3         c

報酬履歴DB

userid    pen    cup  
---------------------
1         0      0
2         0      0
3         0      0

理想的には、PHP スクリプトの実行後に RewardHistoryDB を更新して、ユーザー 1 がペンを受け取り、ユーザー 3 がカップを受け取ったことを反映します (DB は次のようになります:)

RewardHistoryDB (後)

userid    pen    cup  
---------------------
1         1      0
2         0      0
3         0      1

これが私が現在使用しているPHPコードです(完全ではありません):

$userid=array();
$i=0;

//Find All users
$result = mysqli_query($con,"SELECT userid FROM usersdb")
while ($row = mysqli_fetch_array($result)){
    $universityid[$i]=$row['universityid'];
    $i++;
}

//Find History
$courseid=array();
foreach ($userid as $userid1){
$result = mysqli_query($con,"SELECT courseid FROM historydb WHERE userid='".$userid1."'");
    while ($row = mysqli_fetch_array($result)){
        $courseid[]=$row;
    }
}

//Update Reward DB
//Don't even know where to start...

どんな助けでも大歓迎です。ご不明な点がございましたら、お気軽にお問い合わせください。

よろしくお願いします!

4

1 に答える 1

0

http://sqlfiddle.com/#!2/1a96b/1/0

これはクエリと同じように実行でき、PHP でロジックを実行する必要はありません。

update RewardHistoryDB
   set Pen = 1 
   where UserID in ( 
         select  UserID 
         from    HistoryDB 
         where   CourseID in ('A','B')
         group   by UserID
         having  count(UserID)=2);


update RewardHistoryDB
   set Cup = 1 
   where UserID in ( 
         select  UserID 
         from    HistoryDB 
         where   CourseID in ('B','C')
         group   by UserID
         having  count(UserID)=2);

または、1 つの大きなステートメントで行うこともできます...

update RewardHistoryDB   

      left outer join (
            select  UserID as Pens_UserID
            from    HistoryDB 
            where   CourseID in ('A','B')
            group   by UserID
            having  count(UserID)=2 ) as Pens
         on RewardHistoryDB.UserID = Pens.Pens_UserID 

      left outer join (
            select  UserID as Cups_UserID
            from    HistoryDB 
            where   CourseID in ('B','C')
            group   by UserID
            having  count(UserID)=2 ) as Cups
         on RewardHistoryDB.UserID = Cups.Cups_UserID 

set Pen = case when Pens.Pens_UserID is not null then 1 else 0 end,
    Cup = case when Cups.Cups_UserID is not null then 1 else 0 end
于 2013-10-17T16:33:46.950 に答える