有没有更好的方法来在 mysql 和 PHP 中查询它


Is there a better way to query this in mysql and PHP

我正在使用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