MySQL Вставьте в post_meta с помощью select и join - что я делаю не так? - PullRequest
0 голосов
/ 25 мая 2018

Итак, я пытаюсь запустить операцию SQL:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT a.post_id, '_attached_image', b.ID
FROM wp4t_postmeta a 
INNER JOIN wp4t_posts b ON a.meta_value WHERE a.meta_key="_content_field_42" 
= b.guid

По сути, мне нужна таблица wp4t_postmeta, обновленная с помощью идентификатора записи, мета-ключа (attach_image) и meta_value.

Мне нужно, чтобы значение meta_value было получено из идентификатора wp4t_posts, когда значение meta_value для meta_key _content_field_42 в wp4t_postmeta совпадает с идентификатором wp4t_posts.

Сначала у меня заканчивался размер в каталоге tmp каждый раз, когда я пытался запустить егопоэтому я добавил ограничение для его проверки:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT a.post_id, '_attached_image', b.ID
FROM wp4t_postmeta a 
INNER JOIN wp4t_posts b ON a.meta_value WHERE a.meta_key="_content_field_42" 
= b.guid LIMIT 10;

Теперь я получаю сообщение об ошибке "# 1062 - Дублирующая запись '0' для ключа 'PRIMARY' '

Я понимаю, что этотаблица автоинкремента meta_id из wp4t_postmeta, но я подумал, что если бы я ее не включил, она бы автоматически добавлялась?

Что я здесь не так делаю?

Кроме того, есть лилучший способ написать этот запрос?

Обновить .... Достигается прогресс:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid  
WHERE postmeta.meta_key="_content_field_42"
AND posts.post_type="attachment"

РЕДАКТИРОВАТЬ .... Все еще развивается:

INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID 
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid 
AND postmeta.meta_key = '_content_field_42' 
WHERE posts.post_type="attachment"

Ответы [ 2 ]

0 голосов
/ 01 июня 2018

Я собираюсь занять горячую секунду, чтобы ответить на это.

Мой запрос был верным.

Я просто не включил автоинкремент, потому что был недопустимый идентификатор 0, который я удалил.

РЕДАКТИРОВАТЬ: FINAL CORRECT QUERY

-----------------------------------------------------------------
INSERT INTO wp4t_postmeta (post_id, meta_key, meta_value)
SELECT postmeta.post_id, '_attached_image', posts.ID 
FROM wp4t_postmeta AS postmeta 
INNER JOIN wp4t_posts AS posts ON postmeta.meta_value = posts.guid 
WHERE postmeta.meta_key = '_content_field_42' 
AND posts.post_type="attachment"
-----------------------------------------------------------------

Работал на VPS-сервере с таблицами более 1 ММ в wp_postmeta - потребовалось некоторое время, но он запустился.

0 голосов
/ 28 мая 2018

ON a.meta_value равно "истина" всякий раз, когда a.meta_value не является пустым.Это, вероятно, не то, что вы хотели.Возможно, это:

ON b.id = a.post_id

Если этого недостаточно, давайте рассмотрим несколько соответствующих строк как a, так и b.

. Дальнейшее объяснение: Когда предложение ON имеет видвсегда "true", вы создаете временную таблицу, которая является all комбинациями a и b.Если у каждого есть 10K строк, это будет временная таблица с 100M строк.Это, вероятно, переполнит пространство в каталоге tmp.

Но, если вы пройдете мимо этого, вы можете получить до 10K строк с тем же a.post_id

Но даже это не объясняет все,Если я не ошибаюсь, post_id - это AUTO_INCREMENT, который обычно не содержит 0.Единственный вероятный способ получить 0 - это явно вставить 0.

Но это то, что вы делаете.

ОК, я не могу определить, где оригинал 0пришли, но это может быть ключом к другой проблеме.

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