2013-09-23 5 views
0

Я пытаюсь запросить mysql для сортировки сообщений через расстояние позволяет говорить в радиусе 250 миль, все работает отлично, за исключением того, что мне нужно заказывать сообщения таким образом, чтобы показанные сообщения всегда были наверху. Вот мой запрос mysql (я делаю это на wordpress).Wordpress сортировать по расстоянию и рассылать по запросу

SELECT SQL_CALC_FOUND_ROWS wp_posts.*, (3959 * acos(cos(radians(40.140711)) * cos(  radians(latitude.meta_value)) * cos(radians(longitude.meta_value) - radians(-74.20619299999998)) + sin(radians(40.140711)) * sin(radians(latitude.meta_value)))) AS distance , 
latitude.meta_value AS latitude , 
longitude.meta_value AS longitude 
    FROM wp_posts 
    INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id) 
    INNER JOIN wp_postmeta AS latitude ON wp_posts.ID = latitude.post_id 
    INNER JOIN wp_postmeta AS longitude ON wp_posts.ID = longitude.post_id 
    WHERE 1=1 
    AND wp_posts.post_type = 'event' 
    AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'recurring') 
    AND (wp_postmeta.meta_key = 'st_date') 
    AND latitude.meta_key="geo_latitude" 
    AND longitude.meta_key="geo_longitude" 
    AND wp_posts.ID in (SELECT tr.object_id FROM wp_term_relationships tr JOIN wp_term_taxonomy t on t.term_taxonomy_id=tr.term_taxonomy_id WHERE t.term_id IN ('3','4','5','6','7','8','9','10')) 
    AND (wp_posts.ID IN (SELECT wp_postmeta.post_id FROM wp_postmeta WHERE wp_postmeta.meta_key='st_date' 
    AND date_format(wp_postmeta.meta_value,'%Y-%m-%d') >'2013-09-23 14:35:58')) 
    GROUP BY wp_posts.ID HAVING distance <= 250 
    ORDER BY (SELECT wp_postmeta.meta_value FROM wp_postmeta, wp_posts AS p where wp_postmeta.post_id=p.ID AND wp_postmeta.meta_key = 'featured_h') ASC, distance ASC LIMIT 0, 10 

вопрос с ORDER BY, он дает мне ошибку "подзапрос возвращает более чем на 1 строку"

ЕСЛИ удалить ORDER BY (выберите wp_postmeta.meta_value из wp_postmeta, wp_posts, как р, где wp_postmeta.post_id = p.ID и wp_postmeta.meta_key = «featured_h»

он работает нормально, но это не показывает fetaured сообщения сверху, какой-нибудь способ это исправить.

+0

я пришел, я видел много вещей , боль в мозге, затем ушла. –

ответ

0

Поместите колонку в вашем результирующем показывая featured статуса. Я верю, снова присоединяюсь к wp_postmeta, чтобы это произошло.

Затем используйте

ORDER BY status, distance 

или, может быть,

ORDER BY STATUS='featured', distance 

Это поместит ваши признакам сообщения первым отсортированы по расстоянию, затем остальные.

(Это довольно странно ставить подзапрос в ORDER BY п.)

0

Попробуйте это я выбранный custom_order_by columnn из подзапроса и порядка этой

SELECT SQL_CALC_FOUND_ROWS wp_posts.*, (3959 * acos(cos(radians(40.140711)) * cos(  radians(latitude.meta_value)) * cos(radians(longitude.meta_value) - radians(-74.20619299999998)) + sin(radians(40.140711)) * sin(radians(latitude.meta_value)))) AS distance , 
latitude.meta_value AS latitude , 
longitude.meta_value AS longitude, 
(SELECT wp.meta_value FROM wp_postmeta wp where wp.post_id=wpm.post_id AND wp.meta_key = 'featured_h') AS custom_order_by 
FROM wp_posts 
     INNER JOIN wp_postmeta AS wpm ON (wp_posts.ID = wp_postmeta.post_id) 
     INNER JOIN wp_postmeta AS latitude ON wp_posts.ID = latitude.post_id 
     INNER JOIN wp_postmeta AS longitude ON wp_posts.ID = longitude.post_id 
     WHERE 1=1 
     AND wp_posts.post_type = 'event' 
     AND (wp_posts.post_status = 'publish' OR wp_posts.post_status = 'recurring') 
     AND (wpm.meta_key = 'st_date') 
     AND latitude.meta_key="geo_latitude" 
     AND longitude.meta_key="geo_longitude" 
     AND wp_posts.ID in (SELECT tr.object_id FROM wp_term_relationships tr JOIN wp_term_taxonomy t on t.term_taxonomy_id=tr.term_taxonomy_id WHERE t.term_id IN ('3','4','5','6','7','8','9','10')) 
     AND (wp_posts.ID IN (SELECT wp_postmeta.post_id FROM wp_postmeta WHERE wp_postmeta.meta_key='st_date' 
     AND date_format(wp_postmeta.meta_value,'%Y-%m-%d') >'2013-09-23 14:35:58')) 
     GROUP BY wp_posts.ID HAVING distance <= 250 
     ORDER BY custom_order_by ASC, distance ASC LIMIT 0, 10 
Смежные вопросы