it-swarm-ja.com

ロジックを使用したカスタムMySQLクエリ

Wp e-commerceプラグインをインストールし、カスタムビルドカスタムグローバル検索を作成しました

私のクエリは次のようになります

SELECT * FROM aka_v_posts 
LEFT JOIN aka_v_postmeta 
ON aka_v_posts.ID=aka_v_postmeta.post_id 
AND ((aka_v_postmeta.meta_key='_wpsc_special_price' 
      AND aka_v_postmeta.meta_value > '0') 
    OR aka_v_postmeta.meta_key='_wpsc_price')
WHERE ( post_title LIKE '%32%' OR post_content LIKE '%32%' )
AND ( post_status = 'publish' OR post_status = 'private' ) 
AND post_type = 'wpsc-product' 
AND aka_v_postmeta.meta_value BETWEEN 0 AND 999999 
ORDER BY aka_v_posts.post_date DESC, aka_v_postmeta.meta_value + 0 ASC

私がここでやっているのは、製品がセール中の場合はセールにmeta_valueで投稿し、それ以外の場合はmeta_key "_wpsc_price"で取得する価格に参加することです。

もちろん、この部分は機能していません

AND ((aka_v_postmeta.meta_key='_wpsc_special_price' 
      AND aka_v_postmeta.meta_value > '0') 
    OR aka_v_postmeta.meta_key='_wpsc_price')

製品が販売されていないときに製品を照会しますが、販売されている場合は、1つが「_wpsc_price」meta_keyで、もう1つが「_wpsc_special_price」で表示されます。1OR 1は1完全に乱雑です。

私はmysqlのknolidgeを少し調べて、CASE WHEN条件を見つけましたが、現在の問題にそれを適用する方法を見つけませんでした。

助言がありますか?もちろん、CASE WHENなしでそれを行う方が良いでしょう

1
CBeTJlu4ok

ご清聴ありがとうございました。

誰かが2つのpostmetaを使ってデータベースに問い合わせる必要があるなら、ここにコードがあります

SELECT p.* 
, CASE WHEN m1.meta_value=0 OR m1.meta_value IS NULL 
THEN m2.meta_value 
ELSE m1.meta_value 
END meta_value 
FROM aka_v_posts p 
LEFT JOIN aka_v_postmeta m1 ON p.id=m1.post_id AND m1.meta_key='_wpsc_special_price' 
LEFT JOIN aka_v_postmeta m2 ON p.id=m2.post_id AND m2.meta_key='_wpsc_price' 
WHERE post_title LIKE '%32%'
AND post_type = 'wpsc-product' 
ORDER BY aka_v_posts.post_date DESC

覚えておくべきことは(少なくとも私はそれを間違ってやっていた)あなたはそれらのmeta_valuesを選択するためにFROMキーワードの前にmeta_valuesをチェックする必要があるということです。

1
CBeTJlu4ok