Упорядочить результаты запроса по двум парам ключ / значение, где поля для пар ключ / значение совпадают - PullRequest
0 голосов
/ 03 апреля 2012

У меня есть запрос на выбор сообщений (wp_posts table), где либо одна пара ключ / значение, либо другая присутствует во второй таблице (wp_postmeta). По сути, это работает, но мне нужно упорядочить результаты по первому значению ключ / пара (department_head), а затем по второму (staff_surname).

Проблема заключается в том, что из-за способа, которым результаты захватываются запросом, не существует клавиши department_head, с помощью которой можно упорядочить результаты. Я предполагаю, что это потому, что запрос сначала находит ключ staff_surname?

Опять угадываю, но если мое предположение верное, то это потому, что, хотя я и дважды присоединяюсь к таблице, MYSQL просто извлекает первый экземпляр из таблицы wp_postmeta, когда выполняется условие staff_surname. Это то, что мне нужно найти, чтобы у меня были правильные данные, чтобы можно было упорядочить результаты.

Полный запрос -

SELECT SQL_CALC_FOUND_ROWS wp_posts.*
FROM wp_posts
INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id)
INNER JOIN wp_postmeta ON (wp_posts.ID = wp_postmeta.post_id)
INNER JOIN wp_postmeta AS mt1 ON (wp_posts.ID = mt1.post_id)
WHERE 1=1
AND (
    wp_term_relationships.term_taxonomy_id IN (34)
)
AND wp_posts.post_type = 'people'
AND (
    wp_posts.post_status = 'publish'
    OR wp_posts.post_status = 'private'
)
AND (
    (
        wp_postmeta.meta_key = 'department_head'
        AND CAST(wp_postmeta.meta_value AS CHAR) = 'private-client'
    )
    OR (
        mt1.meta_key = 'staff_surname'
        AND CAST(mt1.meta_value AS CHAR) != ''
    )
)
GROUP BY wp_posts.ID
ORDER BY mt1.meta_value ASC
LIMIT 0, 10

Пример результатов запроса -

ID  name   meta_id post_id meta_key    meta_value    meta_id  post_id  meta_key       meta_value

1   Test1  10      1       random_key  random_value  11       1        staff_surname  Smith
2   Test1  20      2       random_key  random_value  21       2        staff_surname  Jones
3   Test1  30      3       random_key  random_value  31       3        staff_surname  Harris

Пример того, что мне нужно, если Джонс был начальником отдела -

ID  name   meta_id post_id meta_key         meta_value      meta_id  post_id  meta_key       meta_value

1   Test1  10      1                                        11       1        staff_surname  Smith
2   Test1  22      2       department_head  private-client  21       2        staff_surname  Jones
3   Test1  30      3                                        31       3        staff_surname  Harris

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

Есть ли способ добиться нужных мне результатов заказа?

Примечание: Причина, по которой я разместил это здесь в отличие от сайта Wordpress, заключается в том, что это пользовательский запрос, а не сгенерированный WP, поэтому он, вероятно, будет выходить за рамки большинства экспертов WP. .

1 Ответ

1 голос
/ 03 апреля 2012

Я не уверен, но я попытаюсь приблизиться к этому с помощью ЛЕВОГО СОЕДИНЕНИЯ и перемещения условий в СОЕДИНЕНИЯ, чтобы сделать запрос более эффективным.

Нечто подобное может работать ...

SELECT p.*
FROM wp_posts p
INNER JOIN wp_term_relationships r ON 
    (p.ID=r.object_id AND r.term_taxonomy_id=34)
LEFT JOIN wp_postmeta m1 ON 
    (p.ID=m1.post_id AND m1.meta_key='department_head' AND CAST(m1.meta_value AS CHAR)='private-client')
LEFT JOIN wp_postmeta m2 ON 
    (p.ID=m2.post_id AND m2.meta_key = 'staff_surname' AND CAST(m2.meta_value AS CHAR) != '')
WHERE 
    p.post_type = 'people' 
  AND 
    (p.post_status = 'publish' OR p.post_status = 'private')
GROUP BY p.ID
ORDER BY m1.meta_value DESC, m2.meta_value DESC
LIMIT 0, 10
...