SQL: LIMIT выполняется перед DISTINCT - PullRequest
0 голосов
/ 18 ноября 2011

Я делаю пользовательский запрос WordPress и мне нужно разбить результаты на страницы.Для целей тестирования установлен предел 2. Когда имеется 4 уникальных результата, WP отображает только 1 результат на первой странице, и в сумме результатов он пропускает последний результат.

Я полагаю, проблема врезультат этого запроса:

SELECT DISTINCT* 
FROM wp_posts
LEFT JOIN wp_term_relationships ON ( wp_posts.ID = wp_term_relationships.object_id ) 
WHERE wp_posts.post_status ='publish'
AND wp_posts.post_type ='directory_listing'
AND wp_term_relationships.term_taxonomy_id
IN ( 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82) 
ORDERBY wp_posts.post_title ASC 
LIMIT 0 , 2

Когда я выполняю это непосредственно в MySQL, он возвращает два дубликата вместо двух первых уникальных результатов.

Я делаю это неправильно?Как решить эту проблему?

1 Ответ

0 голосов
/ 18 ноября 2011

LIMIT (или должно быть, если нет ошибки) всегда выполняется после SELECT DISTINCT. Я предполагаю, что ваш запрос НЕ показывает точные дубликаты, он показывает только дубликаты wp_posts столбцов, которые имеют более 1 связанных строк в таблице wp_term_relationships, то есть они имеют более одной связанной таксономии.

Я также думаю, что вам нужны только столбцы wp_posts.*. Попробуйте это, что также избавляет от DISTINCT:

SELECT p.* 
FROM wp_posts AS p
WHERE EXISTS
      ( SELECT *
        FROM wp_term_relationships AS r
        WHERE p.ID = r.object_id  
          AND r.term_taxonomy_id IN 
              ( 64, 65, 66, 67, 68, 69, 70, 71, 72, 73
              , 74, 75, 76, 77, 78, 79, 80, 81, 82) 
      )
  AND p.post_status ='publish'
  AND p.post_type ='directory_listing'
ORDER BY p.post_title ASC
LIMIT 0 , 2

Если вам также нужны таксономии или другие столбцы из таблицы wp_term_relationships, вам придется использовать запрос JOIN и GROUP BY wp_posts.id:

SELECT p.* 
     , GROUP_CONCAT(r.term_taxonomy_id) AS taxonomy_ids
     , COUNT(*) AS number_of_taxonomies
FROM wp_posts AS p
  INNER JOIN wp_term_relationships AS r
    ON p.ID = r.object_id 
WHERE p.post_status ='publish'
  AND p.post_type ='directory_listing'
  AND r.term_taxonomy_id IN 
              ( 64, 65, 66, 67, 68, 69, 70, 71, 72, 73
              , 74, 75, 76, 77, 78, 79, 80, 81, 82) 
GROUP BY p.ID
ORDER BY p.post_title ASC
LIMIT 0 , 2
...