web-dev-qa-db-fra.com

Regroupement des données postmeta liées via une requête SQL

J'utilise le plug-in WP de quelqu'un d'autre, qui stocke de nombreuses données associées dans wp_postmeta en utilisant une "clé artificielle". Nous avons donc efficacement détourné wp_postmeta pour créer une base de données relationnelle imbriquée. Donc, une ligne aura

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

Ensuite, 4 autres lignes réelles de wp_postmeta qui partagent ce post_id contiennent le reste des informations pour cette "ligne" virtuelle de données. Par exemple

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

Et nous aurons beaucoup de "lignes virtuelles" (des centaines) qui partagent toutes le event_id de 19 (et bien sûr beaucoup d'autres avec différents event_ids.

J'ai essayé beaucoup de requêtes SQL, mais je suis perplexe. Comment puis-je obtenir une table qui a groupé des informations pour un event_id commun? Il ne doit pas nécessairement avoir toutes les données , mais uniquement un élément, tel que le champ "Nom". J'ai essayé une sous-requête comme ceci:

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

Cela a probablement l'air ridiculement stupide - cela ne fonctionne pas non plus. J'ai aussi essayé JOIN. Cela semble être quelque chose qui se produirait beaucoup dans le codage WP, mais j'ai cherché et suis arrivé à peu près vide.

2
Jeremy

Si je comprends bien votre question, cela devrait fonctionner:

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

Utilisez ceci comme suit:

$names = get_event_info( 19 , 'Name' );
if ( ! empty($names) ) {
  echo '<ul>';
  foreach ($names as $name) {
    echo '<li>' . $name . '</li>';
  }
  echo '</ul>';
}

Assurez-vous que le deuxième paramètre est exactement le même que meta_key: dans votre exemple meta_key = 'Name', mais la requête SQL est WHERE meta_key='name', la casse est différente!

1
gmazzap

Vous pouvez sélectionner vos publications à l'aide du paramètre meta_query de la classe WP_Query . Obtenez tous les ID de publication des publications qui ont un event_id partagé de 19.

Vous pouvez utiliser les identifiants plus tard pour obtenir toutes les données nécessaires.

0
Pieter

J'ai trébuché dans le même problème et obtenir plus ou moins ce que je voulais de cette façon:

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