>백엔드 개발 >PHP 튜토리얼 >SQL 페이징 쿼리 데이터는 생일 날짜에 따라 가장 가까운 것부터 먼 것까지 어떻게 정렬해야 합니까?

SQL 페이징 쿼리 데이터는 생일 날짜에 따라 가장 가까운 것부터 먼 것까지 어떻게 정렬해야 합니까?

WBOY
WBOY원래의
2016-08-04 09:19:412225검색

사용자의 생년월일에 해당하는 타임스탬프 데이터(예: user_table)를 저장하는 birthday 필드가 있는 사용자 데이터 테이블1994-01-01、1996-07-1이 있습니다

이제 페이지의 사용자 데이터를 최근부터 생일 순으로 검색해야 합니다.
예를 들어 오늘이 2016-07-28이면 생일 날짜는
1995-07-30, 1993-11-31입니다. , 1997-08-29, 1995-07-27
의 4개 사용자 데이터는
1995-07-30, 1997-08-29, 1993-11-31, 1995-07-27

으로 정렬됩니다.

이러한 쿼리 조건을 만족하는 SQL 문은 어떻게 작성하나요?
또는 생일을 저장하는 데이터 테이블의 구조를 적절하게 수정하려면 어떻게 해야 합니까?

답글 내용:

사용자의 생년월일에 해당하는 타임스탬프 데이터(예: user_table)를 저장하는 birthday 필드가 있는 사용자 데이터 테이블1994-01-01、1996-07-1이 있습니다

이제 페이지의 사용자 데이터를 최근부터 생일 순으로 검색해야 합니다.
예를 들어 오늘이 2016-07-28이면 생일 날짜는
1995-07-30, 1993-11-31입니다. , 1997-08-29, 1995-07-27
의 4개 사용자 데이터는
1995-07-30, 1997-08-29, 1993-11-31, 1995-07-27

으로 정렬됩니다.

이러한 쿼리 조건을 만족하는 SQL 문은 어떻게 작성하나요?
또는 생일을 저장하는 데이터 테이블의 구조를 적절하게 수정하려면 어떻게 해야 합니까?

데이터 볼륨 및 성능 문제에 관계없이 간단한 접근 방식:

  1. dayofyear 정보를 저장하는 필드를 추가합니다. 예를 들어 필드 이름이 day_of_year이면 삽입 문은 다음과 같습니다.

<code class="mysql">insert into user_table set ... = ..., day_of_year = DAYOFYEAR('1995-07-30');</code>
  1. 쿼리 시 두 번 쿼리합니다. day_of_year 필드가 현재 값보다 큰지 먼저 쿼리한 다음 이 필드가 현재 값보다 작은지 쿼리하고 day_of_year별로 정렬합니다.

<code class="mysql">select * from user_table where day_of_year >= DAYOFYEAR(CURDATE()) order by day_of_year asc;
select * from user_table where day_of_year < DAYOFYEAR(CURDATE()) order by day_of_year asc;</code>

한 가지 적은 조건을 보세요
mysql은 1995-07-30 시간을 DAYOFYEAR('1995-07-30')로 변환하고, 오늘의 날을 빼면 Days가 됩니다. 차이가 있어서 주문하세요.

생년월일이 같은 경우 연도별 오름차순으로 정렬할 수 있습니다.

<code>select * from user_table order by (DAYOFYEAR(birthday)-DAYOFYEAR(curdate())),year(birthday) ASC</code>

아이디어: 실제로 수행하는 작업은 먼저 뺄셈 후 월을 기준으로 정렬한 다음 뺄셈 후 일을 기준으로 정렬하는 것입니다.

<code>mysql> SELECT name, birthday FROM user_table
 -> WHERE MONTH(birthday) = MONTH(DATE_ADD(CURDATE(),INTERVAL 1 MONTH))
 -> ORDER BY DAY(birthday) asc;
 </code>

위 코드는 당월로부터 1개월 후의 생일 데이터를 가져와서 날짜 오름차순으로 정렬하면 다음 항목을 꺼내기 위해 반복하면 됩니다

<code>DROP TEMPORARY TABLE IF EXISTS aa;
DROP TEMPORARY TABLE IF EXISTS bb;
create temporary table aa(select birthday from user_table 
WHERE substring(birthday,6,10)>'07-28' ORDER BY substring(birthday,6,10) asc);
create temporary table bb(select birthday from user_table 
WHERE substring(birthday,6,10)<'07-28' ORDER BY substring(birthday,6,10) asc );
SELECT * FROM aa Union All SELECT * FROM bb
测试了一下,效果如图所示</code>

1995-07-30
1997-08-29
1993-11-31
1999-01-01
1995-07-27

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.