Сводная таблица перед объединением MySQL (GROUP BY) - PullRequest
1 голос
/ 27 ноября 2011

Мне нужно объединить таблицу перед объединением с другими таблицами.

wp_postmeta GROUP BY wp_postmeta.post_id

Возможно ли это? Где я должен положить его в? Вот мой код:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_postmeta ON wp_posts.ID = wp_postmeta.post_id
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id


WHERE wp_posts.post_type = 'my-type'
   AND wp_posts.post_status = 'publish'
   AND wp_terms.slug IN
      ('field1', 'field2', 'field3')
   AND
   (
        wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value <> '111'
        OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value = '22'
        OR wp_postmeta.meta_key <> 'include' AND wp_postmeta.meta_key <> 'exclude'
   )

Найден новый способ сделать это при тестировании примера ruakh. Я не знаю, почему это работает, но это делает:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.post_type = 'my-type'
   AND wp_posts.post_status = 'publish'
   AND wp_terms.slug IN
      ('field1', 'field2', 'field3')
   AND NOT wp_posts.id IN                # ADDED NOT
   (
      SELECT wp_postmeta.post_id
        FROM wp_postmeta
        WHERE wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value = '111'  #SINCE NOT ABOVE I CHANGED <> to =
           OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value <> '22'  #SINCE NOT ABOVE I CHANGED = to <>
           #I DELETED THIS LINE
   )

Теперь запрос возвращает данные, если не задано include или exclude. И если они, он проверяет ID.

Есть ли какие-либо комментарии к моим изменениям?

БОЛЬШЕ УЛУЧШЕНИЙ:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id

WHERE wp_posts.post_type = 'my-type'
AND wp_posts.post_status = 'publish'
AND wp_terms.slug IN
('field1', 'field2', 'field3')

AND wp_posts.id NOT IN
(
SELECT wp_postmeta.post_id
FROM wp_postmeta

WHERE wp_postmeta.meta_key = 'exclude'
AND wp_postmeta.meta_value IN
('$id', '$id,%', '%,$id,%', '%,$id')

OR wp_postmeta.meta_key = 'include' 
AND wp_postmeta.meta_value NOT IN
('$id', '$id,%', '%,$id,%', '%,$id')

Пример того, как может выглядеть таблица wp_postmeta:

Senario 1 - Только страницы с идентификатором 18 должны получать данные:

meta_id     post_id     meta_key    meta_value
1           30          include     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1

Senario 2 - страницы с идентификатором 18 не должны получать данные:

meta_id     post_id     meta_key    meta_value
1           30          exclude     18
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1

Senario 1 - Все страницы должны получить данные:

meta_id     post_id     meta_key    meta_value
2           30          _edit_lock  1322225789:1
3           30          _edit_last  1

Ответы [ 2 ]

2 голосов
/ 27 ноября 2011

Я не думаю, что вам вообще следует присоединяться к wp_postmeta, так как на самом деле вам ничего от этого не нужно; скорее, вы должны выполнить «semi-join», используя предложение IN или EXISTS. Например:

SELECT wp_posts.post_content, wp_posts.ID, wp_terms.slug
FROM wp_posts
JOIN wp_term_relationships ON wp_posts.ID = wp_term_relationships.object_id
JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id
JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id
WHERE wp_posts.post_type = 'my-type'
   AND wp_posts.post_status = 'publish'
   AND wp_terms.slug IN
      ('field1', 'field2', 'field3')
   AND wp_posts.id IN
   (
      SELECT DISTINCT wp_postmeta.post_id
        FROM wp_postmeta
        WHERE wp_postmeta.meta_key = 'exclude' AND wp_postmeta.meta_value <> '111'
           OR wp_postmeta.meta_key = 'include' AND wp_postmeta.meta_value = '22'
           OR wp_postmeta.meta_key <> 'include' AND wp_postmeta.meta_key <> 'exclude'
   )
0 голосов
/ 27 ноября 2011

Вы можете использовать подзапрос: http://dev.mysql.com/doc/refman/5.0/en/from-clause-subqueries.html

...