Добавление чисел из одной таблицы в другую с помощью INNER JOINs - помогите! - PullRequest
0 голосов
/ 28 июня 2011

Я просмотрел в Интернете что-то похожее на то, что я хочу, но оно не выполняется ... помогите пожалуйста

Мои таблицы имеют следующую структуру:

TABLE team
  id integer autoincrement primary key,
  name varchar,
  pointsfavor integer,
  pointscontra integer

TABLE game
  id integer autoincrement primary key,
  team1_id integer,
  team2_id integer,
  score1 integer, /*score for team1*/
  score2 integer /*score for team2*/

У меня есть это заявление об обновлении до сих пор:

UPDATE team 
INNER JOIN game g1 ON (team.id = g1.team1_id)
INNER JOIN game g2 ON (team.id = g2.team2_id)
SET pointsfavor = pointsfavor 
      + IF(g1.score1 > g1.score2, g1.score1 - g1.score2, 0) 
      + IF(g2.score2 > g2.score1, g2.score2 - g2.score1, 0)
  , pointscontra = pointscontra 
      + IF(g1.score1 < g1.score2, g1.score2 - g1.score1, 0) 
      + IF(g2.score2 < g2.score1, g2.score1 - g2.score2, 0)
WHERE g1.id = 1;

Когда я помещаю его в свой sql, он выполняет функцию, но он не изменяет мои поля 'pointsfavor' и 'pointscontra' из команды ... так что, как говорится, затронутые строки (0) ....

Посмотрите:

my current query

Вот значения, которые я ввел в игру таблицу (оценка1 и оценка2):

game table

и вот таблица team после того, как я приведу код ... остается неизменным:

team table

Пожалуйста, помогите.

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Два обновления (по одному на команду):

UPDATE team t1
SET t1.pointsfavor = t1.pointsfavor + IF(game.score1 > game.score2, game.score1 - game.score2, 0)
, t1.pointscontra = t1.pointscontra + IF(game.score2 > game.score1, game.score2 - game.score1, 0)
FROM team
INNER JOIN game ON game.team1_id=t1.id
WHERE game.id = 1

UPDATE team t2
SET t2.pointsfavor = t2.pointsfavor + IF(game.score2 > game.score1, game.score2 - game.score1, 0)
, t2.pointscontra = t2.pointscontra + IF(game.score1 > game.score2, game.score1 - game.score2, 0)    
FROM team
INNER JOIN game ON game.team2_id=t2.id
WHERE game.id = 1
0 голосов
/ 28 июня 2011

Используйте левое соединение вместо внутреннего соединения:

UPDATE team 
LEFT JOIN game g1 ON (team.id = g1.team1_id)
LEFT JOIN game g2 ON (team.id = g2.team2_id)
SET pointsfavor = pointsfavor 
      + IF(g1.score1 > g1.score2, g1.score1 - g1.score2, 0) 
      + IF(g2.score2 > g2.score1, g2.score2 - g2.score1, 0)
  , pointscontra = pointscontra 
      + IF(g1.score1 < g1.score2, g1.score2 - g1.score1, 0) 
      + IF(g2.score2 < g2.score1, g2.score1 - g2.score2, 0)
WHERE g1.id = 1;

Я не знаю, какие у вас поля таблицы или как работает ваш код, но я полагаю, что ваша проблема в выражении if Например, в первом обновлении (pointsfavor) IF g1.score1> g1.score2 затем g1.score1 - g1.score2, а также во втором if, но во втором обновлении, когда g1.score1> g1.score2 Тогда pointscontra + 0 + 0 и затем, если также сделать то же самое -тогда в этом запросе только баллы по пунктам повлияли. Так что, когда первый оператор предложения (pointsfavor) будет верным, тогда второй пункт в предложении неверен!взгляните на ваш код agian;)

...