0

wp_postmeta、wp_post、および wp_user テーブルに基づいていくつかのフィールドを計算する次の SQL ステートメントがあります。必要なのは、すべての投稿に meta_key='key1' および meta_value >= '1.5' が含まれる結果のみを含めることです。以下のステートメントで試しましたが、フィルタリングされておらず、すべてのレコードを表示しています。

どんな助けでも大歓迎です!

SELECT (display_name) AS 'user',
    SUM(Case When meta_key = 'status' Then meta_value = 'won' else Null End) AS 'Won',
    SUM(Case When meta_key = 'status' Then meta_value = 'lost' else Null End) AS 'Lost',
    COUNT(Case When meta_key = 'odd' Then meta_value else Null End) AS 'Total',
    ROUND (AVG(Case When meta_key = 'odd' Then meta_value else Null End), 2) AS 'Avg odd',
    ROUND (AVG(Case When meta_key = 'bet' Then meta_value else Null End), 2) AS 'Avg bet',
    ROUND (SUM(Case When meta_key = 'balance' Then meta_value else Null End), 2) AS 'Balance'
FROM wp_postmeta pm
INNER JOIN wp_posts p ON pm.post_id = p.ID 
INNER JOIN wp_users u ON p.post_author = u.ID
WHERE Month(post_date) = MONTH(CURRENT_DATE) AND p.post_status='publish' 
GROUP BY (display_name)
HAVING SUM(CASE WHEN pm.meta_key='key1' AND pm.meta_value >='1.5' THEN 1 ELSE 0 END) > 0
ORDER BY Balance DESC
4

1 に答える 1

1

投稿メタテーブルに複数回参加します。これは、インデックスを利用してクエリをより迅速に返す必要があります。2 人のユーザーu.IDが同じdisplay_name. $wpdb->postsデータベースの接頭辞を変更する場合は、 andを使用$wpdb->postmetaすることをお勧めします。これは、セキュリティ上良い考えです。

これはテストされていないことに注意してください。

SELECT 
    display_name user,
    IFNULL(SUM(won.meta_value),0) won,
    IFNULL(SUM(lost.meta_value),0) lost,
    IFNULL(COUNT(odd.meta_value),0) total,
    IFNULL(ROUND(AVG(odd.meta_value),2),0) avg_odd,
    IFNULL(ROUND(AVG(bet.meta_value),2),0) avg_bet,
    IFNULL(ROUND(SUM(balance.meta_value),2),0) balance
FROM {$wpdb->posts} p
JOIN {$wpdb->users} u 
    ON p.post_author = u.ID
JOIN {$wpdb->postmeta} odd 
    ON p.ID = odd.post_id AND odd.meta_key = 'odd'
LEFT JOIN {$wpdb->postmeta} won 
    ON p.ID = won.post_id AND won.meta_key = 'status' AND won.meta_value = 'won'
LEFT JOIN {$wpdb->postmeta} lost 
    ON p.ID = lost.post_id AND lost.meta_key = 'status' AND lost.meta_value = 'lost'
LEFT JOIN {$wpdb->postmeta} bet 
    ON p.ID = bet.post_id AND bet.meta_key = 'bet'
LEFT JOIN {$wpdb->postmeta} balance 
    ON p.ID = balance.post_id AND balance.meta_key = 'balance'
WHERE 
    MONTH(p.post_date) = MONTH(CURRENT_DATE) 
    AND p.post_status = 'publish'
GROUP BY u.ID
HAVING SUM(odd.meta_value) >= 1.5
ORDER BY balance DESC
于 2013-04-16T00:17:40.730 に答える