2013-04-15 3 views
0

У меня есть следующая инструкция SQL для вычисления нескольких полей на основе таблиц wp_postmeta, wp_post и wp_user. Мне нужно включить только результаты, где все сообщения имеют meta_key = 'key1' и meta_value> = '1.5'. Я попытался в заявлении ниже, но он не фильтрует, все равно показывает каждую запись.Отфильтровать заявление MySQL на основе двух столбцов (meta_key и meta_value)

Любая помощь очень ценится!

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 
+1

Привет, я замечаю что-то. Является ли pm.meta_value строкой или числом в вашем фактическом дизайне? – Edper

+0

Привет, это строка. – qebas

ответ

1

Я бы несколько раз присоединился к сообщению мета-таблицы. Это должно использовать индексы, чтобы быстрее вернуть запрос. Вероятно, вы хотите сгруппировать по u.ID, если у двух пользователей есть те же display_name. Использование $wpdb->posts и $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 
+0

Привет, спасибо за ответ. Я не могу заставить вышеупомянутое заявление работать. Я хочу использовать этот оператор в phpmyadmin, чтобы получить рейтинг. Я получаю сообщение об ошибке «Недопустимое использование групповой функции». Кроме того, meta_key 'key1' на самом деле meta_key 'odd', не уверен, что это имеет значение. Спасибо – qebas

+0

Теперь я получаю - # 1054 - Неизвестный столбец «won.status» в разделе «on». – qebas

+1

это должно быть 'win.meta_key', а под ним' lost.meta_key' – doublesharp

Смежные вопросы