通过SQL查询对相关的后元数据进行分组

时间:2012-10-23 作者:Jeremy

我正在使用其他人的WP插件,该插件在wp_postmeta 使用“人造钥匙”。所以我们有效地劫持了wp_postmeta 创建嵌套关系数据库。所以一排会有

 meta_id = 999  
 post_id = 130  
 meta_key = \'event_id\'  
 meta_value = \'19\'  
然后,共享该post\\U id的其他4个实际wp\\U POSTETA行包含该虚拟“行”数据的其余信息。例如

 meta_id = 989
 post_id = 130
 meta_key = \'Name\'
 meta_value = \'Fred\'
我们将有很多“虚拟行”(数百行),它们都共享event_id 19个(当然还有很多其他不同的event_id他们自己的。

我尝试了许多SQL查询,但我还是被难住了。如何获取具有公共event\\u id分组信息的表?它不必包含所有数据,只需包含一部分,例如“Name”字段。我尝试了如下子查询:

SELECT meta_value from wp_postmeta 
WHERE meta_key=\'name\' AND 
post_id IN 
(SELECT post_id FROM wp_postmeta 
WHERE meta_key=\'event_id\' AND meta_value=\'19\');
这可能看起来愚蠢得可笑——它也不起作用。我也试着加入。这似乎是在WP编码中经常出现的东西,但我已经搜索过了,结果几乎是空的。

3 个回复
SO网友:gmazzap

如果我正确理解您的问题,这应该可以:

function get_event_info($event_id = 0, $info = \'\' ) {
  global $wpdb;
  return $wpdb->get_col(
    $wpdb->prepare(
      "SELECT meta_value from $wpdb->postmeta WHERE 
      meta_key = \'%s\' AND post_id IN
      (SELECT DISTINCT post_id FROM $wpdb->postmeta WHERE meta_key = \'event_id\' AND meta_value= %s )",
      $info, $event_id
    )
  );
}
这样使用:

$names = get_event_info( 19 , \'Name\' );
if ( ! empty($names) ) {
  echo \'<ul>\';
  foreach ($names as $name) {
    echo \'<li>\' . $name . \'</li>\';
  }
  echo \'</ul>\';
}
请确保第二个参数与meta_key: 在您的示例中meta_key = \'Name\' 但是SQL查询是WHERE meta_key=\'name\', 情况不同!

SO网友:Pieter

您可以使用WP_Query class. 获取共享event\\u ID为19的帖子的所有帖子ID。

您可以稍后使用ID来获取所有必要的数据。

SO网友:agaved

我遇到了同样的问题,通过这种方式或多或少地得到了我想要的:

SELECT t.post_id, t.meta_value, u.meta_value
FROM  `wp_postmeta` t INNER JOIN  `wp_postmeta` u
ON t.post_id = u.post_id
WHERE
u.meta_key =  \'first_key\' AND
t.meta_key =  \'second_key\'

结束

相关推荐

Search URL parameters query

Possible Duplicate:Custom search form with empty parameters 希望这是一个快速的过程,但我遇到了麻烦。我有多个搜索词,关键字,类别,国家和日期。我将其设置为用户不必搜索所有这些过滤器。我可以省略类别和/或日期,它将显示更松散的结果。但如果我离开国家,它不会显示任何结果,对任何其他参数执行相同的操作仍会显示结果。问题只在于国家。/?s=a&cat=41&country=&monthnum=&year= 不产生结果,但