Абсолютный новичок, пытающийся ОГРАНИЧИТЬ И ЗАКАЗАТЬ запрос DELETE / JOIN в MySQL - PullRequest
0 голосов
/ 15 мая 2019

Мне передали запрос MySQL об удалении миллионов объектов, к которым я пытаюсь добавить LIMIT, который также ORDERS BY ASC.Я мало представляю, что я делаю, и я очень застрял.

Из того, что я понимаю, вы не можете ОГРАНИЧИТЬ УДАЛЕНИЕ из нескольких таблиц, но решения, которые я нашел, позволяют обойти эту проблему.мне было слишком сложно адаптироваться самостоятельно.

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id )
LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
LEFT JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id )
LEFT JOIN wp_terms e ON ( e.term_id = d.term_id )
WHERE d.taxonomy = 'edd_log_type' AND a.post_type = 'edd_log' AND e.term_id = 167
ORDER BY ID ASC LIMIT 100;

Ожидание: я пытаюсь создать запрос, который найдет и удалит самые старые 100 записей.Я помещаю LIMIT, потому что количество записей (миллионов), обрабатываемых во время ожидания запроса в противном случае.

Фактический результат: синтаксические ошибки из-за того, что LIMIT не работает с удалением из нескольких таблиц, насколько я понимаюпо крайней мере.

1 Ответ

1 голос
/ 15 мая 2019

Вы не должны использовать столбцы, относящиеся к левой объединенной таблице, в предложении where, поскольку использование where это работает как внутреннее объединение. В этих случаях вам следует переместить соответствующее условие в предложении ON

И для удаления (на основе вашегокод) вы можете присоединиться, вы удалите statemente с запросом, который возвращает 100 идентификаторов, которые вам нужны

  delete a,b,c 
  FROM wp_posts a
  LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id )
  LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
  LEFT JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id ) AND d.taxonomy = 'edd_log_type'
  LEFT JOIN wp_terms e ON ( e.term_id = d.term_id ) AND e.term_id = 167
  INNER JOIN  ( 

      select a.id 
      FROM wp_posts a
      LEFT JOIN wp_term_relationships b ON ( a.ID = b.object_id )
      LEFT JOIN wp_postmeta c ON ( a.ID = c.post_id )
      LEFT JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id ) AND d.taxonomy = 'edd_log_type'
      LEFT JOIN wp_terms e ON ( e.term_id = d.term_id ) AND e.term_id = 167
      WHERE a.post_type = 'edd_log'
      ORDER BY ID ASC 
      LIMIT 100

  ) t ON t.id = a.id 
  WHERE AND a.post_type = 'edd_log'

, и, как предлагает Strawberry для удаления, лучше использовать внутреннее объединение (вы не можете удалить строкикоторые не совпадают)

  delete a,b,c 
  FROM wp_posts a
  INNER  JOIN wp_term_relationships b ON ( a.ID = b.object_id )
  INNER  JOIN wp_postmeta c ON ( a.ID = c.post_id )
  INNER  JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id ) AND d.taxonomy = 'edd_log_type'
  INNER  JOIN wp_terms e ON ( e.term_id = d.term_id ) AND e.term_id = 167
  INNER JOIN  ( 

      select a.id 
      FROM wp_posts a
      INNER  JOIN wp_term_relationships b ON ( a.ID = b.object_id )
      INNER  JOIN wp_postmeta c ON ( a.ID = c.post_id )
      INNER  JOIN wp_term_taxonomy d ON ( d.term_taxonomy_id = b.term_taxonomy_id ) AND d.taxonomy = 'edd_log_type'
      INNER  JOIN wp_terms e ON ( e.term_id = d.term_id ) AND e.term_id = 167
      WHERE a.post_type = 'edd_log'
      ORDER BY ID ASC 
      LIMIT 100

  ) t ON t.id = a.id 
  WHERE AND a.post_type = 'edd_log'
...