mysql - 如何创建具有分类值 ("home"、 "away"的列)以另一个表中的列值为条件

标签 mysql indexing sequelpro

我想在表“starting_pitcher_game_log”中为“HomeAway_ID”创建一个列,条件是另一个表中两列“FLD_team_ID”和“Away_Team_ID”的值,这样当“FLD_team_ID”和“Away_Team_ID”分别等于另外,新列的值应为“Away”,当它们彼此不相等时,新列的值应为“Home”。新列的值应为当前表“starting_pitcher_game_log”中的“Starting_Pitcher”列提供游戏站点信息(“Home”或“Away”)。 “FLD_team_ID”列包括“Starting_Pitcher”列中标识的首发投手所在球队的值。因此,换句话说,我希望“Starting_Pitcher”列的每一行(对应于给定的首发投手参加的不同比赛)指定比赛地点,即“主场”或“客场”游戏。

这是执行查询的代码,但该列除了两个值外都是“Home”,尽管一半应该是“Home”,一半应该是“Away”

ALTER TABLE retrosheet.starting_pitcher_game_log ADD HomeAway_ID VARCHAR (4);
UPDATE retrosheet.starting_pitcher_game_log as b, retrosheet.events as g
SET b.HomeAway_ID = IF(g.`AWAY_TEAM_ID`=g.`FLD_TEAM_ID`,"Away","Home")
WHERE b.`Starting_Pitcher` = g.`PIT_ID`

有人可以就导致此问题的代码可能存在的问题提供一些指导吗?

更新:这是上面原始代码中四个字段的 TRIM 命令的代码

UPDATE events SET PIT_ID = TRIM(PIT_ID)

UPDATE starting_pitcher_game_log SET Starting_Pitcher = TRIM(Starting_Pitcher)

UPDATE events SET AWAY_TEAM_ID = TRIM(AWAY_TEAM_ID)

UPDATE events SET FLD_TEAM_ID = TRIM(FLD_TEAM_ID)

然后我运行了以下代码,尝试使用 CHAR 和 VARCHAR 作为 HomeAway_ID 的变量类型,并尝试使用“AWAY”和“Home”,然后在条件语句中使用“AWAY”和“Home”第 3 行。

ALTER TABLE retrosheet.starting_pitcher_game_log ADD COLUMN HomeAway_ID CHAR(4);
    UPDATE retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g
    SET b.HomeAway_ID=IF(g.`AWAY_TEAM_ID`=g.`FLD_TEAM_ID`,'Away','Home')
    WHERE b.`Starting_Pitcher`=g.`PIT_ID`

我很难过——觉得它不应该这么难……它只是不停地处理。

如有任何帮助,我们将不胜感激。

更新:

我尝试了以下代码,实现了推荐的 INNER JOIN 命令,但它仍然需要很长时间来处理查询并且还没有看到它完成:

ALTER TABLE retrosheet.starting_pitcher_game_log ADD COLUMN HomeAway_ID CHAR (4);
UPDATE retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g INNER JOIN retrosheet.starting_pitcher_game_log ON g.AWAY_TEAM_ID = g.FLD_TEAM_ID 
SET b.HomeAway_ID=IF(g.AWAY_TEAM_ID=g.FLD_TEAM_ID,'Away','Home') WHERE b.Starting_Pitcher=g.PIT_ID

更新:

ALTER TABLE events ADD INDEX (PIT_ID, FLD_TEAM_ID, AWAY_TEAM_ID)

我没有使用事件表中的任何引用字段创建主键,因为我计划在将来以不同方式对查询中引用的那些列进行排序。

然后我运行这个查询来创建列:

ALTER TABLE retrosheet.starting_pitcher_game_log ADD COLUMN HomeAway_CD CHAR (4);
UPDATE retrosheet.starting_pitcher_game_log AS b, retrosheet.events AS g JOIN retrosheet.starting_pitcher_game_log ON g.AWAY_TEAM_ID = g.FLD_TEAM_ID 
SET b.HomeAway_CD=IF(g.AWAY_TEAM_ID=g.FLD_TEAM_ID,'Away','Home') WHERE b.Starting_Pitcher = g.PIT_ID

它会一直持续下去......

为列编制索引以适时地执行查询的最佳方法是什么。

正确代码: 首先,我索引了表中可以准确/充分生成该新列的最少字段数(我想在其中添加新列 HomeAway_CD):

ALTER TABLE starting_pitcher_game_log ADD INDEX (GAME_ID, Starting_Pitcher);

这是生成该列的代码。在 where 子句中,我单独尝试了“b.GAME_ID=g.GAME_ID”,并单独尝试了“b.Starting_Pitcher = g.PIT_ID”,每次查询都耗时很长。但是,起始投手列和 Game_ID 列都必须从源表链接到目标表:

UPDATE retrosheet.starting_pitcher_game_log AS b, 
       retrosheet.events AS g 
   SET b.HomeAway_CD=IF(g.AWAY_TEAM_ID=g.FLD_TEAM_ID,'Away','Home') 
WHERE b.GAME_ID=g.GAME_ID
   AND b.Starting_Pitcher = g.PIT_ID

最佳答案

在比较它们之前修剪字段。我认为您那里有一些隐藏的前导或尾随空白。

关于mysql - 如何创建具有分类值 ("home"、 "away"的列)以另一个表中的列值为条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34125084/

相关文章:

php - 如何安全地编写在 WHERE 子句中包含 IN 条件的 Joomla SELECT 查询?

mysql - 何时在连接表上添加索引

Mysql执行sql查询花费太多时间,基于多重join

mysql - 如果MySQL的InnoDB PRIMARY列自动建立索引,为什么索引长度报告为零?

mysql - 相同的 SQL 代码在不同的 MySQL 客户端上返回不同的结果集

php - 警告 : MySQL extension needs to be loaded for OpenCart to work

php - 小于运算符给出奇怪的结果

mysql - 如何将两个过程组合在一起来填充一个表,而不是两个过程中的每一个过程填充它自己的表?

mysql - SQL Server 默认值 x 行的平均值

MySQL 表触发器正确语法