Каким будет SQL-запрос для этой операции UPDATE? - PullRequest
0 голосов
/ 22 июля 2011

Я использую MySql 5.1.я должен базы данных таблиц Users и Users_group_mapping.

User Table :
    userid, username,   points
     1       user1       10
     2       user2       21
     3       user3       7
     4       user4       44

Users_group_mapping Table  :
    userid, usergroupid
     1       1
     2       2
     4       2
     4       1
     4       3

И в процессе распределения я должен распределить точки для соответствующих групп пользователей.Для этого теста данные выглядят так:

Data : $dtArr = array(
    [1] => 40,
    [2] => 80,
    [3] => 100
)

В массиве $ dtArr ключ - это атрибут 'usergroupdid' в таблице Users_group_mapping, а значение - это точки атрибута, которые будут обновлены в таблице Users.

например, если usergroupid = 2 и количество баллов = 40, то из таблицы Users_group_mapping пользователи в группе пользователей '2', которые являются идентификаторами пользователей '2' и '4', оба пользователя получают по 40 баллов.идентификатор пользователя '4' получит только 40 баллов, выделенных через группу пользователей '2', даже если пользователь также входит в группы пользователей '1' и '3'.

Каким будет запрос на обновление SQL для этой операции?

Пожалуйста, ведите меня .. !!заранее спасибо. !!

1 Ответ

1 голос
/ 22 июля 2011

Если у вас есть все в базе данных и если вы действительно хотите сделать это в порядке, заданном таблицей Users_group_mapping, то вам следует добавить столбец последовательности в эту таблицу и создать новую таблицу Data.Таким образом, у вас будет что-то вроде этого:

User Table :
    userid, username,   points
     1       user1       10
     2       user2       21
     3       user3       7
     4       user4       44

Users_group_mapping Table  :
    userid, usergroupid  rowseq
     1       1            1
     2       2            2
     4       2            3
     4       1            4
     4       3            5

Data Table  :
    usergroupid, points
     1             40
     2             80  
     3            100

, чем требуемый SQL, выглядит следующим образом:

UPDATE User 
  JOIN Users_group_mapping USING (userid) 
  JOIN Data on Data.usergroupid=Users_group_mapping.usergroupid
  LEFT JOIN Users_group_mapping as x ON x.userid=User.userid and x.rowseq < Users_group_mapping.rowseq 
  SET User.points = User.points + Data.points
  WHERE x.userid IS NULL

, если вы не хотите добавлять балловк уже существующим точкам, но установите их, чем, конечно, используйте

UPDATE User 
  JOIN Users_group_mapping USING (userid) 
  JOIN Data on Data.usergroupid=Users_group_mapping.usergroupid
  LEFT JOIN Users_group_mapping as x ON x.userid=User.userid and x.rowseq < Users_group_mapping.rowseq 
  SET User.points = Data.points
  WHERE x.userid IS NULL

РЕДАКТИРОВАТЬ

Вот решение, если вы не можете изменить структуру данных (php +mysql)

$userids[] = array();
$result = mysql_query("SELECT * FROM User");

while ($row = mysql_fetch_assoc($result)) {
  $userids[] = $user_row['userid'];
};

foreach($userids as $userid) {
  $result = mysql_query("SELECT usergroupid FROM  Users_group_mapping WHERE userid = $userid");
  $row = mysql_fetch_assoc($result));   # we only need first matching row so no cycle
  $usergroupid = intval($row['usergroupid']);
  $points = $dtArr[$usergroupid];
  mysql_query("UPDATE User SET points = points + $points WHERE User.userid = $userid");   
};

пожалуйста, обратите внимание, что, хотя код правильный, потому что это не так сложно решить, будут некоторые глупые ошибки (синтаксические ошибки и т. д.), так как у меня нет времени на его отладку,Но он должен дать вам ответ.

...