2011-08-20 4 views
0

나는 테이블 세트 (전화 번호부, 숫자, extrafields, extradatas)오늘 행사 인 행을 선택하는 방법은 무엇입니까? 각 전화 번호부 번호 목록 (NUMBER_ID, book_id, 수 - 사용자의 전화 번호부 (사용자 이름, book_id, 제목) <br> 번호 목록 -

전화 번호부를 fullfield)
extrafields - 추가 필드 목록 (생일, 이메일, ...) 및 해당 테이블 필드는 다음과 같습니다. field_id, title
extradatas - 각 번호의 추가 자료 목록 (book_id, field_id, number_id, value)
관계 - 어떤 전화 번호부에 속하는 여분의 필드 (book_id, field_id)

전화 번호부와 추가 생일 필드가있는 사용자를 상상해보십시오.
생일이 오늘 인 번호를 어떻게 선택할 수 있습니까?

편집 : 나는 (PHP 스크립트에서) 내 손에 uname, book_id, field_id를 지정하고 결과를이 값으로 제한해야합니다.

날짜 필드를 유닉스 타임 스탬프에 저장하고 extradatas에 저장합니다. value 유형은 varchar입니다. 이것은 내 인생에서 (내가 생각하는) 가장 어려운 수학 조인입니다.

왜 수학입니까? : 내가 필요 (DATE_FORMAT 같은) 기능을 사용하지 않고 토룬 시도

+1

왜 유닉스 타임 스탬프를 사용하여 생년월일을 저장합니까? –

+0

유닉스 타임 스탬프에서 포맷 된 날짜 문자열보다 더 빨리 작업 할 수 있다고 생각하기 때문입니다. 내가 잘못? –

답변

0
SELECT DISTINCT n.number 
FROM phonebooks p 
INNER JOIN numbers n ON n.book_id = p.book_id 
INNER JOIN extradatas ed ON ed.book_id = n.book_id 
INNER JOIN extrafields ef ON ef.field_id = ed.field_id AND ef.title = 'birthday' 
WHERE p.book_id = :book_id 
    AND p.username = :username 
    AND ed.value BETWEEN unix_timestamp(DATE(now())) 
     AND unix_timestamp(DATE(now()) + INTERVAL 1 DAY); 

참고 만 유의 한 차이 (내가 볼 것을) 사이 내 대답과 @Andrej L은 내가 날짜를 비교하는 방법이다. 더 큰 데이터 세트에서 @Andrej L의 솔루션은 DATEFORMAT를 사용하여 시스템의 모든 생일을 변환해야합니다. 내 솔루션은 MySQL이 비교를 한 번 정면으로 평가할 수 있어야하며, 아마도 extrafields.value에 대한 인덱스를 활용할 수 있어야합니다.

+0

왜'ef.value'입니까? 'ed.value'가 아닌가? 게다가 나는 (PHP 스크립트에서) 내 책의'book_id','field_id','uname'을 지정했고 결과는이 조건들로 제한되어야합니다. –

+0

예, ed.value 여야합니다. 또한 추가 조건을 고려하여 쿼리를 업데이트합니다 ... –

+0

내 질문에 대한 귀하의 노력 덕분에 감사합니다. –

0

을 유닉스 timetampt에서 일 수를 계산하기 원하기 때문에 :

Select number from numbers as n inner join extradatas e on (n.number_id=e.number_id and n.book_id=e.book_id) inner join extrafields ex on e.field_id=ex.field_id 
where ex.title='birthday' and DATE_FORMAT(ex.value, '%Y-%m-%d')=DATE_FORMAT(NOW(), '%Y-%m-%d')