2011-10-15 4 views
4

나는 부동산 웹 사이트를 만들었으며 목록의 최신 업데이트 및 완전성 목록 정렬을 원했습니다. 그래서 나는 가장 최근에 업데이트 된 리스팅과 함께 mysql (completion_score)의 필드별로 정렬하는 방법을 알아 내려고 노력해 왔습니다. 완료 점수는 0 점이 좋고 100 점이 완벽하게 100 점 척도가됩니다. 목록을 추가하고 업데이트하고 mysql 데이터베이스에 저장할 때 계산 된 완료 점수를 갖게됩니다. 나는 어떻게 든 날짜와 completion_score를 합쳐서 합쳐야 만 할 것이라고 추측하고 있지만, 하나의 SELECT에서이를 수행하는 방법을 확신 할 수 없습니다.PHP : Advanced ORDER BY

현재 나는 (분명히 완료 점수를 고려하지 않음)이 사용하고 있습니다 :

ORDER BY ".$wpdb->prefix."fsrep_listings.listing_featured DESC, ".$wpdb->prefix."fsrep_listings.listing_last_updated DESC 

나는 그것이 지난 주에 완료되었다 만약 내가 완료 점수 30 점을 추가 할 것이라고 생각했다, 지난 달에 완료 되었다면 완료 점수에 20 점을 추가하고, 마지막 3 개월 동안 완료하면 완료 점수에 10 점을 추가합니다. 나는이 업데이트 완료 점수로 주문할 수 있습니다. 문제는 점수를 조정하기 위해 매일 변경해야하는 방법입니다.

ORDER BY $wpdb->prefix.'fsrep_listings.listing_score' + if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 1 WEEK,30,if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 1 MONTH,20,if($wpdb->prefix.'fsrep_listings.listing_last_updated' > NOW()-INTERVAL 3 MONTHS,10,0)))' DESC'; 

내가 다음 구문 분석 오류 접수 : 구문 오류, 가정/예기치 않은 T_IF을/... 당신이 필요로하는

+0

은 하나입니다 다른 것보다 더 중요합니까? 아니면 둘 다 똑같이 중요하게 만들려고하십니까? – Amber

+0

PHP와 wordpress 태그를 제거하는 것이 좋습니다. 왜냐하면 mysql을 사용하여 정렬을 수행하려는 경우 대답과 관련이 없기 때문입니다. –

+0

나는 그들이 평등하지만 가중치가있는 점수를 얻으려고 노력하고 있지만, 확실히 전통적인 ORDER BY last_update, completion_score가 아닙니다. 지난 주에 업데이트 된 경우 30 포인트, 1 개월 20 포인트 및 3 개월 10 포인트가 증가합니다. 그래서 본질적으로 목록이 100 % 완성되었고 1.5 개월 전에 업데이트 되었다면 점수는 110 점이됩니다. –

답변

1

어떻게 :) 당신은 QUERY 필요하지 않습니다 생각합니다.

UPDATE는

내가 위를 주어진 SQL을 했어 코드는, 그러므로 모든 것이 $wpdb->prefix 부분을 제외하고 따옴표 내에 있어야합니다, 반군 PHP는 없다. (이것은 당신에게뿐만 아니라 코드를주는 다른 사람의 대부분은, 내가 상상하는 것 같은 마크의 대답 @ 간다.), 코드 이런 식으로 뭔가를 보일 것

은 접두사를 추가 :

"ORDER BY ".$wpdb->prefix."fsrep_listings.listing_score - (to_days(now()) - to_days(".$wpdb->prefix."fsrep_listings.listing_last_updated))/3" 
+0

이 작업이 효과가 있습니다. –

+0

다음과 같은 메시지가 나타납니다 : 치명적 오류 :/home의 정의되지 않은 함수 to_days()를 호출하십시오. 여기 내 코드가 있습니다 : $ wpdb-> prefix.'fsrep_listings.listing_score '- (to_days (n ow()) - to_days ($ wpdb-> prefix.'fsrep_listings.listing_last_updated '))/3; –

+0

그것은 일했다! 고맙습니다!! –

0

나는 다음과 같은 코드를 넣어 마크의 조언을 복용

원하는 정렬 방식을 정확히 결정할 수는 있지만 원하는 경우 ORDER BY completion_date DESC, completion_score DESC을 수행하면 가장 최근 날짜가 먼저 표시되며 동등한 날짜에 점수 순으로 정렬됩니다.

+1

나는이 방법에 대해 생각해 보았습니다. 문제는 화요일에 100 % 목록을 작성한 사람보다 월요일에 실제로 불완전한 목록을 넣은 사람보다 높게 나타나는 경우입니다. 나는 사람들에게 신선하고 완전한 목록을주고 싶다. –

3

아이디어가 잘 들립니다. 왜 그걸로 달리지 않는거야?

ORDER BY completion_score + IF(date > NOW()-INTERVAL 1 WEEK,30,IF(date > NOW()-INTERVAL 1 MONTH,20,IF(date > NOW()-INTERVAL 3 MONTHS,10,0))) DESC 

어쨌든.

+0

이것은 내가 생각했던 것보다 더 컸다. 나는이 내일을 어지럽히 야 할 것이다. 고맙습니다! –

+0

@ChrisAllington : 아무것도 upvote처럼 감사합니다 : p – mpen

+1

하지만 나는 충분한 명성이 없습니다. 나는 15 점을 얻 자마자 곧 갈 것이다. 나는 방금이 웹 사이트를 발견했다. 그리고 그것은 굉장하다!! –

0

역순으로 생각할 수 있으므로 이전 항목을 업데이트 할 필요가 없습니다. 현재 주 0, 다음 주 10, 다음 20 등을 고려하십시오.

order by completeion_score - (to_days(now()) - to_days(completion_date))/3 

또는 완료 이후 며칠의 수의 몇 가지 유사한 기능 :이 같은 것에 대해