2014-01-14 45 views
0

我确定答案已经在这里某处,但我找不到我特别需要的东西。在mysql中比较两列相同的连接行

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

我需要比较不同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个独立的元键(将来会更多),所以我期望使用太多的子查询会让它变慢。

(FYI这是为WordPress的境外使用,无需通知我关于get_post_meta()函数)

+0

相关:[为多个元值定制WordPress SQL查询]( http://kuttler.eu/code/custom-wordpress-sql-query-for-multiple-meta-values/) - 为每个元键使用单独的连接。如果我打算使用10个以上的密钥,似乎效率极低。我需要在这里最大化性能,因为这是一个ajax脚本。 –

+0

它可能看起来效率低下,但它表现相当好 – Strawberry

+0

哦,是吗?我不这么认为,也许如果我比较主键,但这都是字符串。我想我会用这个解决方案滚动,直到找到更好的解决方案(如果有更好的解决方案)。当我获得更多的数据时,我肯定会做一些速度测试。 –

回答

0

虽然我不服气的表现,直到我做了一些进一步的调查,路段I放在原来的问题(here)的意见似乎工作。 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