0

SQL クエリがありますが、データベースからの明示的なデータが必要です。

必要なデータを取得するために、各クエリをステージアップしました。

SELECT wp_posts.id, 
       wp_posts.post_title, 
       wp_postmeta.meta_key, 
       wp_postmeta.meta_value 
FROM   wp_postmeta 
       LEFT JOIN wp_posts 
              ON wp_postmeta.post_id = wp_posts.id 
WHERE  wp_posts.post_type = 'bolton' 
       AND wp_postmeta.meta_key IN ( 'address', 'age', 'cricket_club', 
                                     'training_times', 
                                     'location', 'player_type', 'coach' ) 

このステートメントでは、address、age、cricket_club の各行をまとめて返します。

すべてをリストする meta_value 行ではなく、アドレス行の値を取得する必要があります。

アドバイスをいただければ幸いです。

これにさらに。

私はいくつかのコードに手を出しました:

SELECT post_id
FROM wp_postmeta
WHERE post_id = (
SELECT max( post_id )
FROM wp_postmeta ) 

しかし、私はこのようなものを手に入れたいです。

SELECT address
FROM meta_value
WHERE wp_post_meta.meta_key = address

ありがとう

4

2 に答える 2

1

データのピボットを解除したい、つまり、さまざまなデータをさまざまな列に入れたいという疑いがあります。(また、質問でと言うとき、実際にはを意味することが2回あると思いますが、それは私だけかもしれません。)

アンピボットが本当に目的である場合は、次の方法を試すことができます。

SELECT
  p.id,
  p.post_title,
  MAX(CASE pm.meta_key WHEN 'address'        THEN pm.meta_value END) AS address,
  MAX(CASE pm.meta_key WHEN 'age'            THEN pm.meta_value END) AS age,
  MAX(CASE pm.meta_key WHEN 'cricket_club'   THEN pm.meta_value END) AS cricket_club,
  MAX(CASE pm.meta_key WHEN 'training_times' THEN pm.meta_value END) AS training_times,
  MAX(CASE pm.meta_key WHEN 'location'       THEN pm.meta_value END) AS location,
  MAX(CASE pm.meta_key WHEN 'player_type'    THEN pm.meta_value END) AS player_type,
  MAX(CASE pm.meta_key WHEN 'coach'          THEN pm.meta_value END) AS coach
FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.id
WHERE p.post_type = 'bolton'
  AND pm.meta_key IN ( 'address', 'age', 'cricket_club', 
                       'training_times', 
                       'location', 'player_type', 'coach' ) 
GROUP BY
  p.id,
  p.post_title
;

いくつかのメモ:

  1. wp_posts.type = 'bolton'WHERE 句の条件は本質的に同じ効果があるため、LEFT JOIN を INNER JOIN に置き換えました。本当に左結合が必要な場合は、おそらく次のように条件を ON 句に移動する必要があります。

    ...
    FROM wp_postmeta pm
    INNER JOIN wp_posts p ON pm.post_id = p.id
                         AND p.post_type = 'bolton'
    WHERE pm.meta_key IN ( ...
    ...
    

    でもよくわからないので、自分の目で確かめてください。

  2. 他の WHERE 条件wp_postmeta.meta_key IN ( ... )は、クエリがすべてのメタ キーを読み取りますが、列が SELECT 句で定義されているメタ キーのみを返すという意味で、このクエリでは必要ありません。

    条件をそのままにしておくと、クエリがより効率的になる可能性がありますが、列のリストを拡張するのは少し便利ではありません (拡張する必要がある場合に備えて): 条件と SELECT 句の両方を拡張する必要があります。

    そのため、そのままにしておいた方がパフォーマンス的には有利かもしれませんし、外したほうがメンテナンス的にも良いかもしれません。テーブルに多くの行がない場合、パフォーマンスの違いは無視できるはずですが、あなたのケースでそうなるかどうかは、テストによって判断する必要があります。ただし、一般的なアプローチはおそらく、最初はより単純なソリューションを採用し、問題が発生した場合にのみ最適化することです。

于 2013-02-14T05:54:01.643 に答える
0

変更できませんか?

wp_postmeta.meta_key IN ('address','age',...

wp_postmeta.meta_key = 'address';
于 2013-02-13T16:45:15.837 に答える