web-dev-qa-db-ja.com

SQLクエリを介した関連postmetaデータのグループ化

私は他の人のWPプラグインを使っています。これは "人工キー"を使ってwp_postmetaにたくさんの関連データを格納しています。ネストされたリレーショナルデータベースを作成するためにwp_postmetaを効果的にハイジャックします。 1行になります

 meta_id = 999  
 post_id = 130  
 meta_key = 'event_id'  
 meta_value = '19'  

それから、そのpost_idを共有する他の4つの実際のwp_postmeta行には、データのその仮想「行」に関する残りの情報が含まれています。例えば

 meta_id = 989
 post_id = 130
 meta_key = 'Name'
 meta_value = 'Fred'

そして、私たちは19のevent_idを共有するたくさんの "仮想行"(何百も)を持つことになるでしょう(そしてもちろん、それら自身の異なるevent_idsを持つ他のたくさんのもの)。

私は多くのSQLクエリを試してみましたが、私は困惑しています。一般的なevent_idの情報をグループ化したテーブルを取得する方法を教えてください。それはすべてのデータを持つ必要はありません、 'Name'フィールドのように1つの部分だけです。私はこのような副問い合わせを試みました:

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のコーディングで大いに浮かび上がるもののように思えますが、私は検索して、ほとんど空っぽに出てきました。

2
Jeremy

私があなたの質問を正しく理解すれば、これはうまくいくはずです。

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>';
}

2番目のパラメータがmeta_keyと正確に同じであることを確認してください。あなたの例のmeta_key = 'Name'では、SQLクエリはWHERE meta_key='name'です、大文字小文字の違いは異なります!

1
gmazzap

WP_Queryクラス のmeta_queryパラメータを使用して投稿を選択できます。共有のevent_idが19の投稿の投稿IDをすべて取得します。

後でそのIDを使用して、必要なデータをすべて入手することができます。

0
Pieter

私は同じ問題に遭遇し、私がこのようにして欲しいものを多かれ少なかれ得るようになりました:

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'
0
agaved