SQL - упорядочение результатов из объединенной таблицы - PullRequest
0 голосов
/ 11 декабря 2018

Примечание. Этот вопрос относится к конкретному вопросу WordPress, но я хотел бы взглянуть на него с точки зрения чистого SQL: https://wordpress.stackexchange.com/questions/55263/order-posts-by-custom-field-and-if-custom-field-is-empty-return-remaining-posts

Допустим, у нас есть таблицы сследующая структура:

Табе posts: ID (ключ), Title

Таблица post_metadata: post_ID (FKEY), meta_key, meta_value

И я хочу получить идентификатор и заголовок сообщений, которые имеют:

  • запись в post_metadata с key = 'meta_1' и meta_value = 'value_1'
  • И запись в post_metadata с key = 'meta_2' и meta_value = 'value_2'

Я хочу упорядочить результаты по значению третьегометаданные с meta_key = "meta_3".

Теперь вот сложная часть:

Не все записи имеют запись в таблице post_metadata с мета-3 как meta_key.Поскольку я не фильтрую посты по meta_3, а только упорядочиваю, я хотел сохранить эти посты в своих результатах, как если бы они имели пустое значение для этой мета.

Как мы можем этого достичь?

Спасибо

Редактировать:

Теперь есть скрипта SQL: https://www.db -fiddle.com / f / kBNaaRFB5xfna5MniuTpaG / 1

1 Ответ

0 голосов
/ 11 декабря 2018

Возможно:

Используйте левое объединение один раз, чтобы получить значение мета 3, если оно существует, гарантируя, что вы сохраните все посты с мета1 и мета2 с желаемыми значениями.и затем используйте существующее и убедитесь, что вы получаете только записи, имеющие и meta1, и 2. с желаемыми значениями.

UNTESTED ...

SELECT P.ID, P.Title, PM.Meta_value
FROM Posts P
LEFT JOIN Post_MetaData PM
 on P.ID = PM.Post_ID
and PM.key = 'meta_3'
WHERE exists (SELECT 1 
              FROM post_meta 
              WHERE ((Key 'meta_1' and meta_value = 'Value_1') OR
                    (Key 'meta_2' and meta_value = 'Value_2'))
                and P.ID = Post_ID  --Either here or an AND in the HAVING clause...need to test to know

              GROUP BY  Post_ID
              HAVING count(*) = 2 )
ORDER BY -PM.meta_value desc, P.ID

Это предполагает, что post_metaData имеет уникальное ограничениена ключ для Post_ID.в противном случае мы можем получить meta_1 со значением a и meta1 со значением a, а count (*) будет равен 2;и неправильно вернуть его в результатах.

Чтобы последние значения были нулевыми, следуйте этому подходу; MySQL Orderby by number, Null last

Делать это как IN .... но я думаю, что это будет медленнее.

SELECT P.ID, P.Title, PM.Meta_value
FROM Posts P
LEFT JOIN Post_MetaData PM
 on P.ID = PM.Post_ID
and PM.key = 'meta_3'
WHERE P.ID in (SELECT Post_meta.Post_ID
              FROM post_meta 
              WHERE ((Key 'meta_1' and meta_value = 'Value_1') OR
                    (Key 'meta_2' and meta_value = 'Value_2'))
              GROUP BY  Post_ID
              HAVING count(*) = 2 )
ORDER BY -PM.meta_value desc, P.ID
...