2

下面的查询不返回任何值,name1因为它没有wp_postmeta.meta_key = 'wpcf-phone'. 我LEFT OUTER JOIN认为它会返回结果,name1因为它有值,wp_posts但它只是返回值,name2它确实有一个wp_postmeta.meta_key = 'wpcf-phone'.

SELECT 
  wp_posts.ID,
  wp_posts.post_content,
  wp_posts.post_title,
  wp_postmeta.meta_value AS phone
FROM
  wp_posts
  LEFT OUTER JOIN wp_postmeta wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
WHERE
  wp_posts.post_type = 'solicitors' AND 
  wp_posts.post_status = 'publish' AND 
  wp_postmeta.meta_key = 'wpcf-phone' AND 
  (wp_posts.post_title LIKE '%name1%' OR 
  wp_posts.post_title LIKE '%name2%')
4

2 回答 2

3

您在这一行的 where 子句中引用了外部表:

wp_postmeta.meta_key = 'wpcf-phone'

从而消除所有wp_postmeta.meta_key为空的行,有效地将你LEFT JOIN变成一个INNER JOIN(因为NULL = 'wpcf-phone'是假的)。

您应该将您的条件移动到联接:

SELECT 
  wp_posts.ID,
  wp_posts.post_content,
  wp_posts.post_title,
  wp_postmeta.meta_value AS phone
FROM
  wp_posts
  LEFT OUTER JOIN wp_postmeta wp_postmeta 
    ON (wp_posts.ID = wp_postmeta.post_id)
    AND wp_postmeta.meta_key = 'wpcf-phone' 
WHERE
  wp_posts.post_type = 'solicitors' AND 
  wp_posts.post_status = 'publish' AND 
  (wp_posts.post_title LIKE '%name1%' OR 
  wp_posts.post_title LIKE '%name2%')
于 2013-05-24T11:53:27.947 回答
1

OUTER JOIN“连接失败”时,它会用值填充输出中的字段NULL。因此,您可以使用OR IS NULL来测试这种情况。因此,WHERE 子句应该类似于:

WHERE
  wp_posts.post_type = 'solicitors' AND 
  wp_posts.post_status = 'publish' AND 
  (wp_postmeta.meta_key = 'wpcf-phone' OR
      wp_postmeta.meta_key IS NULL) AND 
  (wp_posts.post_title LIKE '%name1%' OR 
      wp_posts.post_title LIKE '%name2%')
于 2013-05-24T11:53:11.283 回答