Сортировать записи по несуществующим полям - PullRequest
1 голос
/ 02 апреля 2020

У меня есть таблица с 4 столбцами:

| id | article_id | meta_key | meta_value |
|----|------------|----------|------------|
| 1  | 135        | author   | Beth       |
| 2  | 135        | status   | draft      |
| 3  | 135        | paywall  | yes        |
| 4  | 136        | author   | Kim        |
| 5  | 136        | status   | publish    |
| 6  | 137        | author   | Mary       |
| 7  | 137        | status   | publish    |

Мне нужно реализовать функцию, которая добавляет meta_key "paywall" либо с да , либо с нет meta_value для новых статей, что означает, что meta_key "paywall" не существует для более старых записей.

Мне нужно извлечь записи по meta_key = "paywall" и отсортировать по meta_value. Проблема заключается в статьях без мета-ключа "paywall", когда сортировка производится по DES C, статьи упорядочены по [Да], [Нет], [статьи без метаклаза paywall].

Is есть способ в SQL, где я могу отсортировать, предполагая значение meta_value равным yes для ключа, который не существует, так что DES C возвращается как [Да], [статьи без мета-ключ paywall], [Нет]?

У меня есть запрос:

SELECT article_id, meta_key, meta_value
FROM wp_meta
WHERE meta_key="paywall"
ORDER BY meta_value
DESC

Ответы [ 3 ]

0 голосов
/ 02 апреля 2020

Один грязный трюк, который вы можете использовать, - группировать по идентификатору статьи и использовать оператор max для получения мета-значения из выражения case, которое принимает значение для paywall, и жестких кодов no для любого другого ключа для имитации получения no для статей, у которых нет этой записи:

SELECT   article_id, 
         'paywall' AS meta_key,
         MAX(CASE meta_key WHEN 'paywall' THEN meta_value ELSE 'no' END) AS meta_value
FROM     wp_meta
GROUP BY article_id
ORDER BY 3 DESC
0 голосов
/ 03 апреля 2020

нам нужно предположить, что в старых статьях есть paywall со значением «да»

Просто вставьте «да» для всех старых статей как одноразовую операцию:

INSERT INTO wp_meta (article_id, meta_key, meta_value)

SELECT all_ids.article_id, 'paywall', 'yes'
FROM
  (SELECT DISTINCT article_id FROM wp_meta) all_ids
  LEFT JOIN
  (SELECT article_id FROM wp_meta WHERE meta_key = 'paywall') paywall_ids
  ON all_ids.article_id = paywall_ids.article_id
WHERE paywall_ids.article_id IS NULL

Вы можете запустить выбор без вставки, чтобы убедиться, что это будет работать так, как ожидалось. Как это работает:

  • получить список всех идентификаторов статей
  • получить список только статей, у которых уже есть платный доступ
  • осталось присоединиться к платному доступу ко всем Это означает, что любые идентификаторы статей в all_ids, у которых нет соответствия, находятся в paywall_ids, и в столбце paywall_ids.article_id
  • будет проверяться пустым
  • создать строку для вставки, Определяет платный доступ как да

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

INSERT INTO wp_meta (article_id, meta_key, meta_value)

SELECT DISTINCT article_id, 'paywall', 'yes'
FROM
  wp_meta
WHERE 
  article_id < (SELECT MIN(article_id) FROM wp_meta WHERE meta_key = 'paywall')
  • найдите первый идентификатор, где использовался платный доступ
  • выберите все уникальные идентификаторы товаров до этого и создайте запись платного доступа
  • вставьте их

Левый маршрут соединения безопаснее, так как он найдет все статьи, у которых нет платного доступа, а не только те, у которых есть определенный идентификатор. Я предлагаю это только потому, что вы указываете, что включили его в какой-то момент, так что вполне вероятно, что у всех, кто до этого его не имел, и у всех, у кого он есть,

Исправление ваших данных всегда будет предпочтительнее, чем запуск SQL, которые взламывают фальшивые данные, это означает, что вы можете включить некоторые старые статьи в paywall-no, если хотите


Кстати, если вы еще не закончили функцию paywall, самый простой способ - это Вставьте запись платного доступа для всех статей, прежде чем вы включите функцию в прямом эфире! Эти другие сценарии предназначены для тех случаев, когда он уже запущен и некоторые записи не имеют платного доступа. Если вы присваиваете всем значениям значение как часть go live, проблема «у некоторых есть, у некоторых нет» никогда не возникает

INSERT INTO wp_meta (article_id, meta_key, meta_value)

SELECT DISTINCT article_id, 'paywall', 'yes'
FRON wp_meta

Делайте это как часть вашего go live script

0 голосов
/ 02 апреля 2020

Если я правильно понимаю:

select article_id
from t
group by article_id
order by sum(meta_key = 'paywall' and value = 'yes') desc,
         sum(meta_key = 'paywall') = 0 desc;

Это ставит «да» на первое место. Тогда недостающие значения. А затем остальные (предположительно, «нет»).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...