比较mysql中相同连接行的两列

时间:2014-01-14 23:19:33

标签: php mysql sql wordpress join

我确定答案已经存在于某处,但我找不到我特别需要的东西。

这很简单。我有一个通过Wordpress的一对多表(wp_posts和wp_postmeta)。 postmeta表具有引用posts表的任意行数。

我需要比较不同postmeta行的两个值。

示例:

SELECT * 
FROM wp_posts
JOIN wp_postmeta ON wp_postmeta.post_id = wp_posts.ID
WHERE
(
    wp_postmeta.meta_key = 'company'
    AND
    wp_postmeta.meta_value LIKE '%Company 01%'
) AND (
    wp_postmeta.meta_key = 'description'
    AND
    wp_postmeta.meta_value LIKE '%Potato%'
)

在上面的示例中,我需要针对同一行中的值检查元键“company”和“description”。但与此同时,我需要检查另一个元键/值对。

比较这些元键的正确方法是什么?我将需要比较每个项目的大约10个单独的元键(将来会更多),所以我希望使用太多的子查询会使它变慢。

(仅供参考,这是在WordPress之外使用,无需告知我有关get_post_meta()函数的信息)

1 个答案:

答案 0 :(得分:0)

虽然在我进行进一步调查之前我不相信表现,但我在原始问题(here)的评论中所写的链接似乎有效。 Strawberry已经解释说这种方法表现良好并且#34;所以我会那样做。

我想我会在这个问题上回答这个问题。如果有人对此答案有所改进(如果有的话)随意单独发布,我肯定会接受最好/最有效的查询。

最后,这是我正在使用的查询的简化版本,大多数不必要的垃圾都被淘汰了。这里的主要目标是为每个元字段执行连接并为其指定名称,以便该字段包含WHERE语句的唯一行:

set @search_term_1 = '%This string is only found in post meta skills%';

select *

from wp_posts post

join wp_postmeta meta_comp ON ( meta_comp.post_id = post.ID AND meta_comp.meta_key = 'post_company' )
join wp_postmeta meta_reas ON ( meta_reas.post_id = post.ID AND meta_reas.meta_key = 'post_reason' )
join wp_postmeta meta_skill ON ( meta_skill.post_id = post.ID AND meta_skill.meta_key = 'post_skills' )
join wp_postmeta meta_method ON ( meta_method.post_id = post.ID AND meta_method.meta_key = 'post_method' )

where

  -- Check post title and description
  post.post_title LIKE @search_term_1
  or
  post.post_content LIKE @search_term_1
  or
  meta_comp.meta_value LIKE @search_term_1
  or
  meta_reas.meta_value like @search_term_1
  or
  meta_skill.meta_value like @search_term_1
  or
  meta_method.meta_value like @search_term_1


group by post.ID

limit 10