es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Eliminar y limitar en MySQL

Tengo una consulta que funciona para mostrar filas que contienen una clave meta específica.

select wp_woocommerce_order_itemmeta.*
from wp_posts, wp_postmeta
inner join wp_woocommerce_order_items, wp_woocommerce_order_itemmeta
where wp_posts.post_type = "shop_subscription"
and wp_postmeta.post_id = wp_posts.ID
and wp_postmeta.meta_key = "_shipping_country"
and wp_postmeta.meta_value = "FR"
and wp_woocommerce_order_items.order_id = wp_posts.ID
and wp_woocommerce_order_itemmeta.order_item_id = wp_woocommerce_order_items.order_item_id
and wp_woocommerce_order_itemmeta.meta_key = "_subtracted_base_location_taxes"

Quiero eliminar estas filas, pero con un límite. Tengo un error con esta consulta SQL.

DELETE wp_woocommerce_order_itemmeta.*
FROM wp_posts, wp_postmeta
inner join wp_woocommerce_order_items, wp_woocommerce_order_itemmeta
WHERE wp_posts.post_type = "shop_subscription"
and wp_postmeta.post_id = wp_posts.ID
and wp_postmeta.meta_key = "_shipping_country"
and wp_postmeta.meta_value = "FR"
and wp_woocommerce_order_items.order_id = wp_posts.ID
and wp_woocommerce_order_itemmeta.order_item_id = wp_woocommerce_order_items.order_item_id
and wp_woocommerce_order_itemmeta.meta_key = "_subtracted_base_location_taxes"
LIMIT 100

He leído que no se puede usar LIMIT directamente dentro de DELETE cuando se hace referencia a varias tablas al mismo tiempo. Soy nuevo en MySQL y estoy atascado. Cualquier ayuda sería apreciada.

Gracias

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Puedes usar una subconsulta para seleccionar las filas que deseas eliminar y luego limitar los resultados de esa subconsulta. Aquí tienes un ejemplo:

    DELETE FROM wp_woocommerce_order_itemmeta
    WHERE order_item_id IN (
      SELECT order_item_id
      FROM wp_posts, wp_postmeta
      INNER JOIN wp_woocommerce_order_items
        ON wp_woocommerce_order_items.order_id = wp_posts.ID
      INNER JOIN wp_woocommerce_order_itemmeta
        ON wp_woocommerce_order_itemmeta.order_item_id = wp_woocommerce_order_items.order_item_id
      WHERE wp_posts.post_type = 'shop_subscription'
        AND wp_postmeta.post_id = wp_posts.ID
        AND wp_postmeta.meta_key = '_shipping_country'
        AND wp_postmeta.meta_value = 'FR'
        AND wp_woocommerce_order_itemmeta.meta_key = '_subtracted_base_location_taxes'
      LIMIT 100
    );
    

    En esta consulta, la subconsulta selecciona los valores order_item_id de las filas que cumplen las condiciones especificadas. Estas son las filas que quieres eliminar. Luego, la consulta externa elimina todas las filas de wp_woocommerce_order_itemmeta que tienen un order_item_id que se encuentra en los resultados de la subconsulta. La palabra clave LIMIT se usa en la subconsulta para limitar el número de filas seleccionadas.

    Ten en cuenta que las tablas wp_posts y wp_postmeta todavía se utilizan en la subconsulta, pero las tablas wp_woocommerce_order_items y wp_woocommerce_order_itemmeta solo se utilizan en la consulta externa. Esto evita el problema de hacer referencia a múltiples tablas en una declaración DELETE con un LIMIT.

Comments are closed.