Som forklaret i kommentaren ovenfor er INDEX(Dob)
bruges ikke -- da dette er et indeks på år-måned-dag . Du skal oprette et indeks på måned-dag .
Nok ikke den mest elegante løsning, men:
CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
`Mob` int, `Dob` int,
PRIMARY KEY (Email), INDEX(`Mob`, `Dob`));
Se http://sqlfiddle.com/#!2/db82ff/1
For et bedre( ?) svar:da MySQL ikke understøtter beregnede kolonner, har du muligvis brug for triggere til at udfylde en "måned-dag"-kolonner og have et indeks på den:
CREATE TABLE `birthdayCard`(`Email` VARCHAR(255), `FirstName` CHAR(30), `LastName` CHAR(30),
`Dob` DATE,
`Birthday` CHAR(5),
PRIMARY KEY (Email), INDEX(`Birthday`));
CREATE TRIGGER ins_bithdayCard BEFORE INSERT ON `birthdayCard`
FOR EACH ROW
SET NEW.`birthday` = DATE_FORMAT(NEW.`Dob`, "%m%d");
CREATE TRIGGER upd_bithdayCard BEFORE UPDATE ON `birthdayCard`
FOR EACH ROW
SET NEW.`birthday` = DATE_FORMAT(NEW.`Dob`, "%m%d");
Dette tillader "simple" indsættelser og bevarer om nødvendigt hele Dob
som i dit originale eksempel:
insert into birthdayCard (Email, FirstName, LastNAme, Dob)
values ("[email protected]", "Sylvain", "Leroux", '2013-08-05');
SELECT
forespørgslen skal ændres for at bruge den nye "søge"-kolonne:
SELECT * FROM `birthdayCard` WHERE Birthday = DATE_FORMAT(NOW(), "%m%d");
Indstil http://sqlfiddle.com/#!2/66111/3