我不知道还能怎么做,我假设有一个 CASE 语句,但如果有更好的方法,请告诉我。
我有两张桌子可以跟踪赛马。一次跟踪他们的信息,另一个跟踪他们的比赛结果。其中一些马将被培育。为了被繁殖,它们必须年满 3 岁,并且必须在当年或前一年参加过比赛。
例如 - 平流层出生于 2000 年,她有资格从 2003 年开始繁殖。然而,她参加了 2002 年、2003 年、2004 年、2005 年和 2006 年的比赛。这意味着她的"开放年份"是2008年,2009年,2010年等。
我不确定如何对此提出理由,因为它类似于(来自马表(YOB+3,并考虑到v_testhorse(记录所在位置(最后一个日期 +1 年并且那一年没有小马驹(HorseID 不等于 DamID 或 SireID(。
我的目标是让它像这样显示 - 马名,YOB,性别,开放年份(这是我试图创造的价值(
提前感谢 - 如果您需要更多信息,请告诉我!
编辑:表格结构- 马: HID(身份证号码,每匹马唯一( HName (马名( YOB 性别 父亲 父亲 父亲 大坝 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');
考虑到两个表被命名为horses
并且race_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'
)