我正在使用postmeta表为wordpress编写一些自定义代码。项目存储在这里,常见的 pk1 是post_id。
但是,我正在做的将有一堆可点击的postmeta部分,例如
- source_site
- source_author
- source_rating
或类似的东西。现在,该表将保存具有相同source_site或source_author的不同帖子的多个帖子数据。
然后,用户可以单击source_author,他们将被带到一个新表,其中包含链接回此source_author的所有帖子或文章。
问题是 I 链接到后元值,而不是通过后 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;
}
现在这都是非常伪代码,我想问题是一旦数据开始变得相当大,我担心这最终会为每个可以单击的部分带来大量开销,并且我必须在单个数组中进行多个选择。
有没有更好的方法来解决这个问题?
正如您提到的,随着数据库的增长,性能成为一个问题,因此您需要将数据库的往返次数限制为尽可能少。 我会拉回给定作者的所有元表行,如下所示:
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