0

半径 250 マイル以内の距離で投稿を並べ替える mysql クエリを試しています。注目の投稿が常に一番上になるように投稿を並べ替える必要があることを除いて、すべて正常に機能します。これが私のmysqlクエリです(私はワードプレスでやっています)。

    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 にあり、「サブクエリが複数の行を返します」というエラーが表示されます

ORDER BY を削除した場合 (wp_postmeta から wp_postmeta.meta_value を選択し、wp_posts を p として wp_postmeta.post_id=p.ID および wp_postmeta.meta_key = 'featured_h' とする)

それは正常に動作しますが、それを修正する方法はありません。

4

2 に答える 2

0

ステータスを示す列を結果セットに配置しfeaturedます。それを実現するには、wp_postmeta に再度参加する必要があると思います。

次に使用します

 ORDER BY status, distance

または多分

 ORDER BY STATUS='featured', distance

これにより、注目の投稿が最初に距離順に並べられ、次に残りの投稿が表示されます。

ORDER BY(サブクエリを句に入れるのはかなり奇妙です。)

于 2013-09-23T15:08:02.513 に答える
0

custom_order_byサブクエリから列を選択し、これで注文したこれを試してください

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
于 2013-09-23T15:08:09.043 に答える