1

我正在使用 postmeta 表为 wordpress 编写一些自定义代码。项目存放在这里,常见的pk1是post_id。

但是,我正在做的将有一堆 postmeta 的可点击部分,例如

  • source_site
  • 来源作者
  • source_rating

或类似的东西。现在,该表将保存具有相同 source_site 或 source_author 的不同帖子的多个帖子数据。

然后,用户可以单击 source_author,他们将被带到一个新表,其中包含链接回此 source_author 的所有帖子或文章。

问题是我链接到一个 postmeta 值,而不是通过 post-id 的 pk1。

这意味着要获取其余数据,我要么必须进行额外的查询,要么必须加入同一个表。

这让我想到了我的问题。做连接或子查询会更好吗?

进一步的问题是 postmeta 表存储了所有各种数据以及键和值,因此很难查询我想要的其他部分。

所以桌子看起来像

   |meta_id|post_id|meta_key|meta_value|
   |1      | 2     |source_author | Dan Holmes |
   |2      | 2     |source_site   |http://somesite.com|

只是寻找最干净的方法来获取这些数据,否则我能想到的就是首先为作者获取数据:

$the_post_ids = select post_id from postmeta where meta_key='source_author' and meta_value='Dan Holmes'

foreach($the_post_ids as $post_id) {
   select * from postmeta where post_id=$post_id;
}

现在这都是非常伪代码,我想问题是一旦数据开始变得相当大,我担心这最终会导致每个可以点击的部分产生很多开销,而我有对单个数组进行多项选择。

有没有更好的方法来处理这个?

4

1 回答 1

0

正如您所提到的,随着数据库的增长,性能成为一个问题,因此您希望尽可能少地限制到数据库的往返。我会像这个查询一样拉回给定作者的所有元表行:

SELECT * FROM postmeta WHERE post_id IN
    (SELECT post_id FROM postmeta
        WHERE meta_key='source_author' AND meta_value='Dan Holmes'
    )

然后在 PHP 中编写一个类似于您所拥有的foreach循环来处理结果。

编辑

这是一个不同的选项,不使用IN子句

SELECT meta1.* FROM postmeta meta1
    INNER JOIN 
        (SELECT DISTINCT postid FROM postmeta
             WHERE postmeta.meta_key = 'source_author' AND postmeta.meta_value = 'Dan Holmes'
        ) meta2 
    ON meta1.post_id = meta2.post_id
于 2012-04-25T03:28:17.163 回答