2017-09-28 5 views
1

無料版のYITH Woocommerceサブスクリプションを使用して、Wordpressサイトのユーザーが定期購入で製品を購入できるようにします。ユーザーが購読を購入すると、いくつかのことが起こります。オーダーの新しい投稿が作成され、そのオーダーの新しいサブスクリプションが作成され、オーダーとサブスクリプションにはさまざまなポストメタが追加されます。私は、製品ID「432」のある特定の製品に対して、ユーザーがアクティブなサブスクリプションを持っているかどうかをチェックすることに懸念しています。選択するクエリ条件ステートメントのすべてのポストメタフィールドに一致する行数(投稿数)

ここでデータベースのレコードの例は次のとおり

post_metaテーブルは

post_id: 468 
meta_key: _product_id 
meta_value: 432 

post_id: 468 
meta_key: _user_id 
meta_value: 1 

post_id: 468 
meta_key: _status 
meta_value: active 

上記の例ではID「1」を持つユーザーは、サブスクリプションである「アクティブ」サブスクリプションを持っていることを示しています製品 "432"の "468"。

データが単一の行に格納されていないため、現在ログインしているユーザーが製品432へのアクティブなサブスクリプションを持っていることを確認するクエリを作成する方法がわかりません。


EDIT:ジェームズの答えでは、私は私のクエリを更新し、以下の結果を得ることができました。ただし、where/having節を正常に実行することはできません。 where節またはhaving節を追加すると、クエリは空を返します。

NEW QUERY:

SELECT post_id, 
GROUP_CONCAT(IF(meta_key='_product_id', meta_value,'') SEPARATOR '') product_id, 
GROUP_CONCAT(IF(meta_key='_status', meta_value,'') SEPARATOR '') status, 
GROUP_CONCAT(IF(meta_key='_user_id', meta_value,'') SEPARATOR '') user 
FROM wprq_postmeta 
GROUP BY post_id 
ORDER BY post_id DESC 

結果:上記の結果セットで

Array 
(
    [0] => Array 
     (
      [post_id] => 471 
      [product_id] => 
      [status] => 
      [user] => 
     ) 
    [1] => Array 
     (
      [post_id] => 468 
      [product_id] => 432 
      [status] => active 
      [user] => 1 
     ) 
    [2] => Array 
     (
      [post_id] => 465 
      [product_id] => 432 
      [status] => active 
      [user] => 2 
     ) 
    [3] => Array 
     (
      [post_id] => 499 
      [product_id] => 
      [status] => 
      [user] => 
     ) 
) 

、私は結果だけを配置したい場所 "ステータス= 'アクティブ' AND product_idの= 432 ANDユーザ= 1 "


EDIT 2:私の持っている句の位置が重要だと思います。私はもともとgroup by節の前にhaving句を持っていましたが、空の結果セットが得られました。グループ句の後に私のhaving句を移動したとき、それは働いていました。ここで

答えて

0

作業。 HAVING句の配置がGROUP BY句の後になければならないことはわかりませんでした。

SELECT post_id, 
GROUP_CONCAT(IF(meta_key='_product_id', meta_value,'') SEPARATOR '') product_id, 
GROUP_CONCAT(IF(meta_key='_status', meta_value,'') SEPARATOR '') status, 
GROUP_CONCAT(IF(meta_key='_user_id', meta_value,'') SEPARATOR '') user 
FROM wprq_postmeta 
GROUP BY post_id 
HAVING product_id = 432 AND status = 'active' AND user = $user 
ORDER BY post_id DESC 
1

はアプローチだ私は、次のクエリを取得することができたジェイムスの助けを借りて、あなたはどの地域の問題を持っているなら、私に知らせて

CREATE TABLE post_meta(post_id INT, meta_key CHAR(32), meta_value CHAR(32)); 

INSERT INTO post_meta VALUES 
    (468, '_product_id', 432), 
    (468, '_user_id', 1), 
    (468, '_status', 'active'), 
    (469, '_product_id', 432), 
    (469, '_user_id', 1), 
    (469, '_status', 'active'); 

SELECT post_id, GROUP_CONCAT(IF(meta_key='_product_id', meta_value,'') SEPARATOR '') _product_id, GROUP_CONCAT(IF(meta_key='_status', meta_value,'') SEPARATOR '') _status FROM post_meta WHERE post_id = 468 AND meta_key IN ('_product_id', '_status') GROUP BY post_id; 

よろしく、

ジェームズ

+0

これは私のために空の結果セットを返しました。しかし、私はこれを少し微調整して作業結果を得ることができました。私の問題は今どこで働いているのかわからないということです。編集した投稿をご覧ください。 – bowlerae

+0

これを今解決しましたか、またはあなたの回答クエリを試してみませんか?もしそうなら。 –

+0

(fat fingers ...)は$ user擬似コードですか?なぜ$プレフィックスではないのでしょうか?確かにそれは@正しいはずですか? –

関連する問題