Я разрабатываю интерфейс PHP, чтобы показать некоторые результаты из двух разных баз данных: MySQL (.sql) и Access один (.mdb). Когда я запрашиваю результаты, я позволяю пользователю выбрать, сколько из них он хочет перечислить, чтобы я мог ограничить и пролистать их с помощью некоторого удовольствия от PHP.
Это безупречно работает для БД MySQL, где ПРЕДЕЛ пункт делает все аккуратно. БД Access — это другой разговор: у Access нет предложения LIMIT, так что я должен использовать ТОП пункт. Жаль, что это делает боль в спине.
Я нашел хороший пример в принятом ответе на этот вопрос, но у меня проблема. Прежде всего, позвольте мне показать вам несколько запросов фрагмента:
QUERY # 1
SELECT TOP 5 *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE `Table_1`.`Some_ID` LIKE 'ID %' AND `Table_1`.`Timestamp` LIKE '2018/03/20 %';
QUERY # 2
SELECT TOP 5 *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE `Table_1`.`Some_ID` LIKE 'ID %' AND `Table_1`.`Timestamp` LIKE '2018/03/20 %'
ORDER BY `Table_1`.`Some_ID`;
Запрос № 1 показывает мне только первые 5 результатов, как и просили.
Жаль, что когда я добавляю СОРТИРОВАТЬ ПО пункт, Запрос № 2 возвращает мне ВСЕ результаты, удовлетворяющие моим условиям.
То же самое не происходит с запросом MySQL как это:
QUERY # 3
SELECT *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE `Table_1`.`Some_ID` LIKE 'ID %' AND `Table_1`.`Timestamp` LIKE '2018/03/20 %'
ORDER BY `Table_1`.`Some_ID`
LIMIT 0, 5;
Итак, я делаю что-то не так с моим запросом Access?
Чтобы завершить мой вопрос, вот как должен выглядеть мой последний запрос Access (я немного изменил предложенный в вышеупомянутой теме):
QUERY # 4
SELECT *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE EXISTS (
SELECT TOP 5 * FROM (
SELECT TOP 10 *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE `Table_1`.`Some_ID` LIKE 'ID %' AND `Table_1`.`Timestamp` LIKE '2018/03/20 %')
ORDER BY `Table_1`.`Some_ID` DESC)
ORDER BY `Table_1`.`Some_ID` ASC;
Наконец мне удалось решить мою проблему. Я отправлю свой запрос на тот случай, если у кого-то еще возникнет такая же проблема.
SELECT TOP 5 *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE `Table_1`.`Timestamp`
IN (
SELECT TOP 5 `Table_1`.`Timestamp`
FROM (
SELECT TOP 10 *
FROM `Table_1` INNER JOIN `Table_2`
ON `Table_1`.`Some_ID` = `Table_2`.`Some_ID`
AND `Table_1`.`Timestamp` = `Table_2`.`Timestamp`
WHERE `Table_1`.`Some_ID` LIKE 'ID %'
AND `Table_2`.`Timestamp` LIKE '2018/03/20 %'
ORDER BY `Table_1`.`Timestamp` ASC)
ORDER BY `Table_1`.`Timestamp` DESC)
ORDER BY `Table_1`.`Timestamp` ASC;
Просто поиграйте с «ASC» и «DESC», чтобы получить результаты, которые вы готовы вернуть.
Других решений пока нет …