Как насчет этого?
SELECT
d1.ID, d1.place, d2.place
FROM
daily AS d1
CROSS JOIN
daily AS d2
USING (ID)
WHERE
d1.date = CURDATE()
AND d2.date = CURDATE() - INTERVAL 1 DAY
ORDER BY
d2.code - d1.code DESC
LIMIT
10
Некоторые мысли о структуре вашей таблицы.
`ID` bigint(40) NOT NULL,
Почему BIGINT?Вам нужно будет делать 136 вставок / с 24 часа в сутки, 7 дней в неделю в течение года, чтобы исчерпать диапазон INT.И прежде чем вы доберетесь до середины, вашему приложению, вероятно, все равно понадобится профессиональный администратор баз данных.Помните, что меньший первичный индекс ведет к более тщательному поиску - что приводит нас к:
PRIMARY KEY (`ID`,`source`,`date`,`cc`)
Почему?Достаточно одного столбца PK на столбце ID
.Если вам нужны индексы для других столбцов, создайте дополнительные индексы (и к этому разумно).На самом деле, у вас есть индекс покрытия для всей таблицы ... как если бы в индексе была вся таблица.
Последнее, но не менее важное: где находится столбец place
?Вы использовали его в своем запросе (а затем я в моем), но его нигде не видно?
Предлагаемая структура таблицы:
CREATE TABLE IF NOT EXISTS `daily` (
`ID` int(10) UNSIGNED NOT NULL, --usually AUTO_INCREMENT is used as well,
`source` char(20) NOT NULL,
`date` date NOT NULL,
`code` int(11) NOT NULL,
`cc` char(2) NOT NULL,
PRIMARY KEY (`ID`),
KEY `ID_date` (`ID`,`date`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;