[英]SQL Wordpress Query - inner vs outer join
我正在尝试获取wp_postmeta表具有的所有帖子(meta_key='propdetails' AND meta_value LIKE '%Vacant Unrented Ready%')
或(meta_key='featured' AND meta_value='on')
。
我现有的查询(下面)正在工作,除非meta_key“功能”行丢失 。 然后,该帖子不会返回。
类似地,对于匹配行,我还需要检索我想获取meta_value
,其中meta_key='martygeocoderlatlng'
。 但是,如果缺少meta_key,则整个帖子都不会返回。
因此,我需要使用现有查询并使meta_key='featured'
或meta_key='martygeocoderlatlng'
可选,因此,如果不存在它们,我仍然可以进行其他比较并获取所需的数据。
(我认为可以通过某种方式使用OUTER JOIN来完成,但是我不能完全弄清语法。)
这是我现有的查询,该查询仅返回wp_postmeta表中的meta_key ='featured'和meta_key ='martygeocoderlatlng'存在的行(当然,还满足WHERE子句中的其他条件):
SELECT
p.*,
pm.*,
pm_featured.meta_value AS featured,
pm_latlng.meta_value AS latlng
FROM
wp_posts p
JOIN wp_postmeta pm
ON pm.post_id = p.ID
JOIN wp_postmeta pm_propdetails
ON (pm_propdetails.post_id = p.ID AND pm_propdetails.meta_key = 'propdetails')
JOIN wp_postmeta pm_featured
ON (pm_featured.post_id = p.ID AND pm_featured.meta_key = 'featured-property')
JOIN wp_postmeta pm_latlng
ON (pm_latlng.post_id = p.ID AND pm_latlng.meta_key = 'martygeocoderlatlng')
JOIN wp_term_relationships tr
ON tr.object_id = p.ID
JOIN wp_term_relationships tr_taxrel
ON (tr_taxrel.object_id = p.ID AND tr_taxrel.term_taxonomy_id = 12)
WHERE
(pm_propdetails.meta_value LIKE '%Vacant Unrented Ready%'
OR
pm_featured.meta_value = 'on')
AND p.post_type = 'property'
AND p.post_status = 'publish'
GROUP BY p.ID
ORDER BY p.post_date DESC
这是一个非常激烈的查询。 在不更好地了解表结构的情况下,很难确切地知道如何有效地执行此操作(似乎可以合并其中的一些JOINS)。
这只是编辑原始查询的一个刺:
SELECT
p.*,
pm.*,
pm_featured.meta_value AS featured,
pm_latlng.meta_value AS latlng
FROM
wp_posts p
JOIN wp_postmeta pm
ON pm.post_id = p.ID
JOIN wp_postmeta pm_propdetails
ON (pm_propdetails.post_id = p.ID AND pm_propdetails.meta_key = 'propdetails')
LEFT JOIN wp_postmeta pm_featured
ON (pm_featured.post_id = p.ID AND pm_featured.meta_key = 'featured-property')
LEFT JOIN wp_postmeta pm_latlng
ON (pm_latlng.post_id = p.ID AND pm_latlng.meta_key = 'martygeocoderlatlng')
JOIN wp_term_relationships tr
ON tr.object_id = p.ID
JOIN wp_term_relationships tr_taxrel
ON (tr_taxrel.object_id = p.ID AND tr_taxrel.term_taxonomy_id = 12)
WHERE
(pm_propdetails.meta_value LIKE '%Vacant Unrented Ready%'
OR
(pm_featured.meta_value = 'on' OR pm_feature.meta_value IS NULL))
AND p.post_type = 'property'
AND p.post_status = 'publish'
GROUP BY p.ID
ORDER BY p.post_date DESC
它只是使用LEFT JOIN尝试返回可能缺少meta_key的帖子,然后修改了WHERE部分以尝试说明pm_featured.meta_value是否为NULL。
如果您提供更多信息,可以尝试其他版本。
编辑:根据您的问题,这可能也可以。 真的只是黑暗中的一枪而已=)
SELECT T2.*, T1.featured, T1.latlng FROM
(
SELECT post_id, SUM(IF((meta_key='propdetails' AND meta_value LIKE '%Vacant Unrented Ready%') OR ((meta_key='featured' AND meta_value='on')),1,0)) AS Keeper
, MAX(IF(meta_key = 'featured-property',meta_value,NULL)) AS featured
, MAX(IF(meta_key = 'martygeocoderlatlng',meta_value,NULL)) AS latlng
FROM wp_postmeta
GROUP BY post_id
HAVING Keeper>0
) AS T1
JOIN
wp_posts AS T2
ON T1.post_id=T2.ID
AND T2.post_type = 'property'
AND T2.post_status = 'publish'
JOIN
wp_term_relationships AS T3
ON T2.ID=T3.object_id AND T3.term_taxonomy_id = 12
GROUP BY T2.ID
ORDER BY T2.post_date DESC
自从第二个查询结束工作(有点令人惊讶,我做了很多假设;)之后,这个查询应该会更快一点,更容易理解...(注意:尤其是当您在( meta_key
, meta_value
)在wp_postmeta
表中。)
SELECT T2.*, T1.featured, T1.latlng FROM
(
SELECT postmetas_info.post_id
, MAX(IF(meta_key = 'featured-property',meta_value,NULL)) AS featured
, MAX(IF(meta_key = 'martygeocoderlatlng',meta_value,NULL)) AS latlng
FROM
(
SELECT DISTINCT post_id FROM wp_postmeta WHERE (meta_key='propdetails' AND meta_value LIKE '%Vacant Unrented Ready%') OR (meta_key='featured' AND meta_value='on')
) AS postmetas_applicable
JOIN
wp_postmeta AS postmetas_info
ON postmetas_applicable.post_id=postmetas_info.post_id
GROUP BY postmetas_info.post_id
) AS T1
JOIN
wp_posts AS T2
ON T1.post_id=T2.ID
AND T2.post_type = 'property'
AND T2.post_status = 'publish'
JOIN
wp_term_relationships AS T3
ON T2.ID=T3.object_id AND T3.term_taxonomy_id = 12
GROUP BY T2.ID
ORDER BY T2.post_date DESC
上一个查询中的SUM(IF())很有趣,但可能不如预期的那样有效,因为它会评估表中的每一行。 上面的查询首先减少了post_id的内容,然后仅基于符合条件的post_id的内容获取相应的数据。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.