MySQL Left Join - PullRequest
       4

MySQL Left Join

1 голос
/ 27 июля 2011

У меня есть 2 таблицы (база данных Wordpress), одна из которых хранит записи, а другая - мета-записи.Для этого примера таблица сообщений хранит информацию о местах (например, бары или клубы).В мета-таблице хранятся оценки, присвоенные этим барам пользователями / посетителями.Рейтинги сохраняются как 20, 40, 60, 80 или 100 под ключом «_rating».У меня есть следующий запрос.

SELECT posts.*, AVG(meta.meta_value) as average 
FROM wp_posts as posts 
LEFT JOIN wp_postmeta as meta 
     ON posts.ID = meta.post_ID 

WHERE meta.meta_key = '_rating' 
     AND posts.post_status = 'publish' 
     AND posts.post_type = 'npc_venue' 

GROUP BY meta.post_id 
ORDER BY post_title asc

Это прекрасно работает, за исключением одной проблемы.Если место еще не получило рейтинг, то в таблице wp_postmeta нет записи «_rating», и, следовательно, она не извлекается в запросе.

Вопрос: Как я могу получить все места избазы данных, с их средним рейтингом, даже если они еще не получили рейтинг.Заранее спасибо!

РЕДАКТИРОВАТЬ: Если место еще не было оценено, то в таблице wp_postmeta нет записи _rating, что поднимает вопрос, что именно означает NULL?NULL обычно используется для неизвестного значения.Тем не менее, когда запись полностью отсутствует в таблице, она все еще считается NULL?Или он просто становится пустым набором строк?

Ответы [ 4 ]

1 голос
/ 27 июля 2011

Поместите meta.meta_key = '_rating' в условие соединения, а не в предложение WHERE, то есть (не проверено):

SELECT posts.*, AVG(meta.meta_value) as average 
FROM wp_posts as posts 
LEFT JOIN wp_postmeta as meta 
     ON posts.ID = meta.post_ID
    AND meta.meta_key = '_rating'

WHERE posts.post_status = 'publish' 
  AND posts.post_type = 'npc_venue' 

GROUP BY posts.ID 
ORDER BY post_title asc

Также обратите внимание на изменение в предложении GROUP BY;если нет соответствующих записей метаданных, meta.post_ID будет НЕДЕЙСТВИТЕЛЕН.

1 голос
/ 27 июля 2011

попробуйте что-то вроде ...

    SELECT posts.*,
    (SELECT AVG(meta.meta_value)
        FROM wp_postmeta as meta
        WHERE posts.ID = meta.post_ID
            AND meta.meta_key = '_rating' 
            AND posts.post_status = 'publish' 
            AND posts.post_type = 'npc_venue) as average
    ORDER BY post_title ASC

... не уверен, будет ли это работать как есть, но идея есть ... сделать "среднее" вычисляемое поле, а не объединение.

0 голосов
/ 27 июля 2011

Дайте этому попытку

SELECT posts.*, AVG(NULLIF(meta.meta_value,0)) as average
0 голосов
/ 27 июля 2011

Для подсчета всех объектов без рейтинга вы можете использовать функцию ISNULL

SELECT posts.*, AVG(ISNULL(meta.meta_value, 0)) as average  
...