마침내 돌아오고 원하는 모든 것을 주문하는 큰 쿼리가 있습니다.MySQL LIMIT 및 OFFSET이 내 결과 주문을 엉망으로 만듭니다.
내 프로젝트에서 페이지 매김을 고집하고 있지만 이제는 LIMIT 및 OFFSET이 쿼리에 포함되어 결과가 다르게 정렬됩니다. 아이디어가 있으십니까?
ANIMAL FOOD
AID AnimalName FID FoodName BuyOn AID
------------------ ------------------------------------------
1 Dog 1 DogBix 2011-11-27 1
2 Cat 2 Tuna 2011-11-11 2
3 Rabbit 3 Bones 2012-06-08 1
4 Bird 4 CatBix 2010-06-04 2
5 Bird Seed 2011-12-12 4
6 Carrots 2011-05-04 3
7 Pedigree Chum 2011-02-08 1
8 Rabbit Mix 2011-09-02 3
그리고이 순서대로 다음과 같은 출력 갖고 싶어 :
AnimalName FoodName BuyOn
----------------------------------------
Cat Tuna 2011-11-11
Cat CatBix 2010-06-04
Dog DogBix 2011-11-27
Dog Bones 2012-06-08
Dog Pedigree Chum 2011-02-08
Bird Bird Seed 2011-12-12
Rabbit Rabbit Mix 2011-09-02
Rabbit Carrots 2011-05-04
그래서 주문을하고
더 INFO-
내 테이블이의 일종 ADDED 미래에 가장 가까운 동물을 그룹화했습니다. 동물의 관련 날짜는 가장 가까운 날짜부터 오름차순까지, 가장 가까운 날짜부터 내림차순 순으로 정렬됩니다.
$offset = ~whatever page I'm on * LIMIT~
$Query = "
SELECT *
FROM animal AS a
INNER JOIN food AS f ON a.aid = f.fid
INNER JOIN
(
SELECT f2.aid,
MIN(IF(DATEDIFF(f2.buyOn, CURDATE()) >= 0, DATEDIFF(f2.buyOn, CURDATE()), 1000000)) AS dateSortFuture,
MAX(IF(DATEDIFF(f2.buyOn, CURDATE()) < 0, DATEDIFF(f2.buyOn, CURDATE()), -1000000)) AS dateSortPast
FROM food AS f2
GROUP BY f2.aid
LIMIT 5
OFFSET ".$offset."
)
AS f3 ON f3.aid = a.aid
ORDER BY f3.dateSortFuture ASC,
f3.dateSortPast DESC,
IF(f.buyOn >= CURDATE(), 0, 1) ASC,
ABS(DATEDIFF(f.buyOn, CURDATE())) ASC, animalName;";
LIMIT와
과 내가 원하는대로 작동 제거 OFFSET : 내가있어
쿼리는 이것이다.
가능한 해결책?
$Query = "
SELECT *
FROM animal AS a
INNER JOIN food AS f ON a.aid = f.fid
INNER JOIN
(
SELECT f2.aid,
MIN(IF(DATEDIFF(f2.buyOn, CURDATE()) >= 0, DATEDIFF(f2.buyOn, CURDATE()), 1000000)) AS dateSortFuture,
MAX(IF(DATEDIFF(f2.buyOn, CURDATE()) < 0, DATEDIFF(f2.buyOn, CURDATE()), -1000000)) AS dateSortPast
FROM food AS f2
GROUP BY f2.aid
ORDER BY f3.dateSortFuture ASC,
f3.dateSortPast DESC,
IF(f.buyOn >= CURDATE(), 0, 1) ASC,
ABS(DATEDIFF(f.buyOn, CURDATE())) ASC, animalName;
LIMIT 5
OFFSET ".$offset."
)
AS f3 ON f3.aid = a.aid
ORDER BY f3.dateSortFuture ASC,
f3.dateSortPast DESC,
IF(f.buyOn >= CURDATE(), 0, 1) ASC,
ABS(DATEDIFF(f.buyOn, CURDATE())) ASC, animalName;
";
같은 후 가진 코드 수 있습니다. – JohnFx