Как запустить SQL-запрос для возврата, даже если поле пустое - PullRequest
0 голосов
/ 12 мая 2011

В настоящее время я выполняю этот SQL-запрос для получения пользовательских сообщений для локатора магазина.Все хорошо, за исключением того, что я хотел бы, чтобы он возвращал товары, даже если поле "телефон" пусто.На данный момент он будет извлекать только те, которые заполнены этим полем.

Вот так выглядит мой запрос при запуске:

my query

У всех естьПодсказка?(Также есть ли более эффективный способ запустить это?)

SELECT   wp_posts.post_title as name, 

        address.meta_value as address,
        latitude.meta_value as lat,
        longitude.meta_value as lng,
        telephone.meta_value as phone,


        ( 3959 * acos(
        cos( radians( '%s' ) ) *
        cos( radians( CONVERT( latitude.meta_value, DECIMAL( 10, 6 ) ) ) ) *
        cos( radians( CONVERT( longitude.meta_value, DECIMAL( 10, 6 ) ) ) - radians( '%s' ) ) +
        sin( radians( '%s' ) ) * sin( radians( CONVERT( latitude.meta_value, DECIMAL( 10, 6 ) ) ) )
         ) ) AS distance

        FROM wp_postmeta as address, wp_postmeta as latitude, wp_postmeta as longitude, wp_postmeta as telephone,
         wp_posts

WHERE   
    (wp_posts.ID = address.post_id
        AND address.meta_key = '_dealer_address' )  

AND     (wp_posts.ID = latitude.post_id
        AND latitude.meta_key = '_dealer_latitude' )

AND     (wp_posts.ID = longitude.post_id
        AND longitude.meta_key = '_dealer_longitude' )      

AND     (wp_posts.ID = telephone.post_id
        AND telephone.meta_key = '_dealer_telephone' )  

Ответы [ 3 ]

2 голосов
/ 27 мая 2011

Размещение ответа согласно предложению Марка Б. из его комментария.

     SELECT  wp_posts.post_title as name, 
address.meta_value as address,
 latitude.meta_value as lat,
 longitude.meta_value as lng,
 telephone.meta_value as telephone,

   ( 3959 * acos(
    cos( radians( '%s' ) ) *
    cos( radians( CONVERT( latitude.meta_value, DECIMAL( 10, 6 ) ) ) ) *
    cos( radians( CONVERT( longitude.meta_value, DECIMAL( 10, 6 ) ) ) - radians( '%s' ) ) +
    sin( radians( '%s' ) ) * sin( radians( CONVERT( latitude.meta_value, DECIMAL( 10, 6 ) ) ) )
     ) ) AS distance

FROM wp_posts
LEFT JOIN wp_postmeta AS address ON(
wp_posts.ID = address.post_id
AND address.meta_key = '_dealer_address'
)
LEFT JOIN wp_postmeta AS latitude ON(
wp_posts.ID = latitude.post_id
AND latitude.meta_key = '_dealer_latitude'
)
LEFT JOIN wp_postmeta AS longitude ON(
wp_posts.ID = longitude.post_id
AND longitude.meta_key = '_dealer_longitude'
)
LEFT JOIN wp_postmeta AS telephone ON(
wp_posts.ID = telephone.post_id
AND telephone.meta_key = '_dealer_telephone'
)
WHERE wp_posts.post_type = 'dealers' HAVING distance < '%s' ORDER BY distance LIMIT 0 ,         20
0 голосов
/ 12 мая 2011

Попробуйте:

    SELECT   wp_posts.post_title as name,          
 address.meta_value as address,       
  latitude.meta_value as lat,        
 longitude.meta_value as lng,      
   telephone.meta_value as phone,    
       ( 3959 * 
acos(         cos( radians( '%s' ) ) *     
    cos( radians( CONVERT( latitude.meta_value, DECIMAL( 10, 6 ) ) ) ) *    
   cos( radians( CONVERT( longitude.meta_value, DECIMAL( 10, 6 ) ) ) - radians( '%s' ) ) + sin( radians( '%s' ) ) * sin( radians( CONVERT( latitude.meta_value, DECIMAL( 10, 6 ) ) ) )          ) ) AS distance         
 FROM wp_postmeta as address,
 wp_postmeta as latitude,
 wp_postmeta as longitude, 
 wp_postmeta as telephone  left outer join    
      wp_posts on (wp_posts.ID = telephone.post_id    AND telephone.meta_key = '_dealer_telephone' ) 
WHERE        (wp_posts.ID = address.post_id     AND address.meta_key = '_dealer_address' )    
AND     (wp_posts.ID = latitude.post_id         AND latitude.meta_key = '_dealer_latitude' )  
AND     (wp_posts.ID = longitude.post_id         AND longitude.meta_key = '_dealer_longitude' )  
0 голосов
/ 12 мая 2011

Для вашего окончательного утверждения AND просто добавьте условие OR для NULL s

AND     (wp_posts.ID = telephone.post_id
        AND telephone.meta_key IS NULL OR telephone.meta_key = '_dealer_telephone' ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...