Удалить повторяющиеся записи с такими же метаданными - PullRequest
0 голосов
/ 27 апреля 2019

Я использую WordPress.Я хотел бы удалить дубликаты сообщений из таблицы wp_post.Условие для определения, является ли сообщение дублирующим или нет, основано на том, имеют ли два разных мета-ключа одинаковые мета-значения.

Я натолкнулся на этот запрос, чтобы удалить пост, в котором дублируется одно мета-значение:

DELETE p, pm1
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = '_email' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value

Я хотел бы добиться чего-то вроде этого:

DELETE p, pm1
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = '_email' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value

    AND pm1.meta_key = '_list' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value

Я попытался выполнить следующее:

DELETE p, pm1
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = '_email' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value
    AND p.ID IN (
        SELECT p, pm1
        FROM 
            {$wpdb->posts} p, 
            {$wpdb->postmeta} pm1, 
            {$wpdb->postmeta} pm2 
        WHERE 
            p.ID = pm1.post_id
            AND pm1.post_id > pm2.post_id 
            AND pm1.meta_key = '_list' 
            AND pm1.meta_key = pm2.meta_key 
            AND pm1.meta_value = pm2.meta_value
    )

, но получил сообщение об ошибке в MySQL.Что я делаю не так?

Любые отзывы приветствуются!Спасибо!

1 Ответ

1 голос
/ 27 апреля 2019

Глядя на ваш код .. у вас не может быть meta_key = '_email' AND = '_list', может быть, вы имеете в виду meta_key = '_email' OR = '_list' Вы не должны (более) использовать старый синтаксис неявного соединения в зависимости от того, где, но используйте более читаемый эксплицит. Синтаксис JOIN

DELETE p, pm1
FROM {$wpdb->posts} p
INNER JOIN {$wpdb->postmeta} pm1 ON p.ID = pm1.post_id 
  AND  ( pm1.meta_key = '_email'  OR  pm1.meta_key = '_list' )
INNER JOIN {$wpdb->postmeta} pm2 ON pm1.post_id > pm2.post_id 
   AND pm1.meta_value = pm2.meta_value 
      AND pm1.meta_key = pm2.meta_key 

В любом случае, вы запрашиваете у вас подзапрос wromg, выберите попробуйте p.ID вместо p, pm1

DELETE p, pm1
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = '_email' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value
    AND p.ID IN (
        SELECT p.ID 
        FROM 
            {$wpdb->posts} p, 
            {$wpdb->postmeta} pm1, 
            {$wpdb->postmeta} pm2 
        WHERE 
            p.ID = pm1.post_id
            AND pm1.post_id > pm2.post_id 
            AND pm1.meta_key = '_list' 
            AND pm1.meta_key = pm2.meta_key 
            AND pm1.meta_value = pm2.meta_value
    )

это также может означать, что вы не можете удалить из таблиц, которые вы используете как выберите в этом случае в этом случае попытайтесь форсировать внутренний результат как временную таблицу с вложенным подзапросом

DELETE p, pm1
FROM 
    {$wpdb->posts} p, 
    {$wpdb->postmeta} pm1, 
    {$wpdb->postmeta} pm2 
WHERE 
    p.ID = pm1.post_id
    AND pm1.post_id > pm2.post_id 
    AND pm1.meta_key = '_email' 
    AND pm1.meta_key = pm2.meta_key 
    AND pm1.meta_value = pm2.meta_value
    AND p.ID IN (
      select t.ID from  (
        SELECT p.ID 
        FROM 
            {$wpdb->posts} p, 
            {$wpdb->postmeta} pm1, 
            {$wpdb->postmeta} pm2 
        WHERE 
            p.ID = pm1.post_id
            AND pm1.post_id > pm2.post_id 
            AND pm1.meta_key = '_list' 
            AND pm1.meta_key = pm2.meta_key 
            AND pm1.meta_value = pm2.meta_value
        ) t 
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...