两个表之间的CASE语句(高级)

时间:2018-05-12 21:47:03

标签: php mysql case case-statement

我不确定如何做到这一点,我假设CASE声明,但让我知道是否有更好的方法。

我有两张桌子跟踪赛马。一旦跟踪他们的信息,另一个他们的比赛结果。其中一些马将会繁殖。为了繁殖,他们必须是3岁或以上,并且他们必须在那一年或前一年参加比赛。

例如 - 平流层出生于2000年,她有资格从2003年开始繁殖。然而,她在2002年,2003年,2004年,2005年和2006年参加比赛。这意味着她的开放年份#34;是2008年,2009年,2010年等等。

我不知道如何为此做一个案例,因为它会像(来自Horses表)YOB + 3,并考虑到v_testhorse(记录所在的位置)最后DATE +1年并且那一年没有马驹(HorseID不等于DamID或SireID)。

我的目标是让它显示如下 - HorseName,YOB,Gender,YEARS OPEN(这是我试图创造的价值)

提前致谢 - 如果您需要更多信息,请与我们联系!

编辑:表格结构 - 马匹: HID(身份证号码,每匹马独有)HName(马名)YOB性别父亲SireID Dam DamID类型OName稳定

结果:

  • 选项 SID(ShowID,每个节目都是唯一的)SName日期(00-00-0000)主持人CName年级性别年份地点代币收入HName

编辑编辑:SqFiddle是http://sqlfiddle.com/#!9/5e1ad6,但如果它不起作用,那么我使用的代码。我只输入了一些值,因为这两个数据库都很大,但这里有一匹马要测试!



CREATE TABLE Horses 
(HID INT(11), 
 HName VARCHAR(225), 
 YOB YEAR, 
 Sire VARCHAR(225), 
 SireID INT(5), 
 Dam VARCHAR(225), 
 DamID INT(5) );

INSERT INTO Horses (HID, HName, YOB, Sire, SireID, Dam, DamID)
VALUES ('17578','Stratosphere','2001','Stonebridge First', '464', 'Cloud Nine', '6714');
INSERT INTO Horses (HID, HName, YOB, Sire, SireID, Dam, DamID)
VALUES ('36791','Troposphere','2012','Trapper Joe', '36595', 'Stratosphere', '17578');
INSERT INTO Horses (HID, HName, YOB, Sire, SireID, Dam, DamID)
VALUES ('38249','Xalena','2011','Arlin', '31886', 'Stratosphere', '17578');


CREATE TABLE Results 
(HID INT(11), 
 HName VARCHAR(225), 
 Date2 DATE, 
 CName VARCHAR(225), 
 SName VARCHAR(225), 
 ShowID INT(5) );
 
INSERT INTO Results (HID, HName, Date2, CName, SName, ShowID)
VALUES ('17578','Stratosphere','2004-10-10','SHRA October Trotting Derby, 1 mile, 3YO Trotters', 'SHRA October Racemeet', '13');

INSERT INTO Results (HID, HName, Date2, CName, SName, ShowID)
VALUES ('17578','Stratosphere','2007-01-19','Snow Drift Trot, 3YO+ Trotting FM', 'SHRA Start the Season Meet', '889');




1 个答案:

答案 0 :(得分:0)

考虑将两个表命名为horsesrace_results,下面的内容几乎可以解决这个问题。

SELECT * FROM horses
LEFT JOIN  race_results race ON (
  race.horse_id = horses.id 
  AND race.year IN (YEAR(CURDATE()), (YEAR(CURDATE()) - 1))
)
WHERE TIMESTAMPDIFF( YEAR, horses.dob, now()) >= 3;

将上述内容视为POC,您可以根据表结构实现它。

<强>更新

如果要更改列数据类型,只需使用正确的数据类型创建另一列Date2,然后运行以下查询,一旦交叉检查Date2列中的所有值都正确,您可以删除Date列。

UPDATE table_name SET Date2 = STR_TO_DATE(
  CONCAT(
    LEFT(SUBSTRING_INDEX(Date,',',1), length(Date)-2)), 
    " ",
    SUBSTRING_INDEX(Date,',',-1)
  ), '%M %d %Y'
)