【问题标题】:Comparing two columns of the same joined row in mysql比较mysql中同一连接行的两列
【发布时间】:2014-02-03 06:07:15
【问题描述】:

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

这很简单。我有一个通过 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%'
)

在上面的示例中,我需要根据同一行中的值检查元键“公司”和“描述”。但同时,我需要检查另一个元键/值对。

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

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

【问题讨论】:

  • 相关:Custom WordPress SQL query for multiple meta values - 为每个元键使用单独的连接。如果我要使用 10 多个键,似乎效率非常低。我需要在这里最大化性能,因为这是针对 ajax 脚本的。
  • 它可能看起来效率低下,但实际上它的表现相当不错
  • 哦,是吗?我不这么认为,也许如果我在比较主键,但这都是字符串。我想我会采用该解决方案,直到找到更好的解决方案(如果有更好的解决方案)。当我们获得更多数据时,我肯定会进行一些速度测试。
  • 是的,但是无论查询类型如何,这部分问题都会存在,因为“%string”不能使用索引

标签: php mysql sql wordpress join


【解决方案1】:

虽然在进行进一步调查之前我不会相信性能,但我在原始问题 (here) 的 cmets 中放置的链接似乎有效。 Strawberry 解释说这种方法“效果很好”,所以我会继续这样做。

我想我会发布这个问题的答案,因为我现在已经开始工作了。如果有人对此答案有改进(如果有的话),请随时单独发布,我一定会接受最好/最有效的查询。

最后,这是我现在使用的查询的简化版本,其中大部分不必要的垃圾都被删除了。这里的主要目标是为每个元字段进行连接并为其分配一个名称,以便该字段包含 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多