No se puede obtener un complicado consulta de mysql para trabajar

Estoy tratando de escribir una consulta de mysql y estoy teniendo algunos problemas con él. Estoy tratando de consulta WooCommerce datos de mi base de datos de Wordpress. Básicos de la factura los datos se almacenan en la tabla wp_posts y el resto de los datos se almacenan en la tabla wp_postmeta. Ahora 1 inovice en la tabla wp_posts puntos a varios elementos en la tabla wp_postmeta. Aquí es un ejemplo.

WP_POSTS

----------------------------------------------------
ID Fecha de ESTADO
----------------------------------------------------
0001 ABRIR 01/01/2000
0002 ABRIR 01/01/2000
0003 CERRADO 01/02/2000

WP_POSTMETA

--------------------------------------------------------------------------
ID POST_ID META_KEY META_VALUE
--------------------------------------------------------------------------
0001 0001 CustomerLN Prueba
0002 0001 CustomerFN Tester
0003 0001 Payment_Type PayPal
0004 0001 Invoice_Total $200
0005 0002 CustomerLN Doe
0006 0002 CustomerFN Juan
0007 0002 Payment_Type CC-Mastercard
0008 0002 Invoice_Total $1000

Tengo una consulta básica que extrae los datos de la tabla wp_posts pero no puedo averiguar cómo extraer los datos de la segunda tabla se basa en la META_KEY valor.

Cualquier ayuda sería genial. Gracias de antemano.

  • Respuesta seleccionada
    peterm
    2 de septiembre de 2013

    Bienvenidos a la Entidad-Atributo-Valor en el mundo.

    Normal representación del conjunto de resultados que usted puede ser que necesite no solo JOIN estas dos tablas, pero también PIVOT el conjunto de resultados. Usted puede hacer eso con una consulta como

    SELECT p.id, p.status,
           MAX(CASE WHEN m.meta_key = 'CustomerLN'    
                    THEN m.meta_value END) customer_last_name,
           MAX(CASE WHEN m.meta_key = 'CustomerFN'    
                    THEN m.meta_value END) customer_firt_name,
           MAX(CASE WHEN m.meta_key = 'Payment_Type'  
                    THEN m.meta_value END) payment_type,
           MAX(CASE WHEN m.meta_key = 'Invoice_Total' 
                    THEN m.meta_value END) invoice_total
     FROM wp_posts p LEFT JOIN wp_postmeta m
       ON p.id = m.post_id
     GROUP BY p.id, p.status
    

    Ejemplo de salida:

    +------+--------+--------------------+--------------------+---------------+---------------+
    | id | estado | customer_last_name | customer_firt_name | payment_type | invoice_total |
    +------+--------+--------------------+--------------------+---------------+---------------+
    | 1 | ABRIR | Test | Tester | PayPal | $200 |
    | 2 | ABIERTO | Doe | Juan | CC-Mastercard | $1000 |
    | 3 | CERRADO | NULL | NULL | NULL | NULL |
    +------+--------+--------------------+--------------------+---------------+---------------+
    

    Aquí es SQLFiddle demo


    Ahora, para ser capaz de filtrar los registros de base en teclas meta y meta los valores que usted tendrá que usar HAVING cláusula

    Por ejemplo, si usted desea conseguir las facturas expedidas por el cliente Jhon Doe

    SELECT p.id, p.status,
           MAX(CASE WHEN m.meta_key = 'CustomerLN'    
                    THEN m.meta_value END) customer_last_name,
           MAX(CASE WHEN m.meta_key = 'CustomerFN'    
                    THEN m.meta_value END) customer_first_name,
           MAX(CASE WHEN m.meta_key = 'Payment_Type'  
                    THEN m.meta_value END) payment_type,
           MAX(CASE WHEN m.meta_key = 'Invoice_Total' 
                    THEN m.meta_value END) invoice_total
     FROM wp_posts p LEFT JOIN wp_postmeta m
       ON p.id = m.post_id
     GROUP BY p.id, p.status
    HAVING customer_last_name = 'Doe'
       AND customer_first_name = 'John'
    

    Salida:

    +------+--------+--------------------+---------------------+---------------+---------------+
    | id | estado | customer_last_name | customer_first_name | payment_type | invoice_total |
    +------+--------+--------------------+---------------------+---------------+---------------+
    | 2 | ABIERTO | Doe | Juan | CC-Mastercard | $1000 |
    +------+--------+--------------------+---------------------+---------------+---------------+
    

    Aquí es SQLFiddle demo

3 Respuestas

  • Scary Wombat
    2 de septiembre de 2013

    Para empezar, me gustaría hacer

    select a.*, b.* from WP_POSTS a, wp_postmeta b
    where b.POST_ID = a.id
    

    ¿Qué has hecho?

  • pfrank
    2 de septiembre de 2013

    Por esta circunstancia desea utilizar un "JOIN". Echa un vistazo http://www.w3schools.com/sql/sql_join.asp, que es casi exactamente lo que usted desea hacer.

    Se va a terminar algo como:

    SELECT *
    FROM wp_posts
    INNER JOIN wp_postmeta
    ON wp_posts.ID=wp_postmeta.PostId;
    

    También tenga en cuenta que su nombre de la tabla es malo para la segunda tabla.

  • tony gil
    31 de enero de 2017

    En primer lugar, usted no debe tratar de UNIR ambas tablas, debido a que sus estructuras de tabla son disímiles. Vamos a crear una vista que consume WP_POSTMETA's de datos, consolidación de los mismos.

    Unirse WP_POSTMETA con la misma X-1 veces para cada X campos que están interesados en produce 0 a X líneas para cada Post_ID. El uso de WHERE cláusula para conseguir un 1 en la columna de cada copia de la tabla y reducir la cantidad total de líneas por Post_ID a 1 (o a ninguno).

    Filtro de la basura y voilà!

    NOTA: [table_name2] puede ser llamado temp0, [table_name3] llamada temp1, [table_name4] llamada temp2, o lo que usted desea.

    SELECT WP_POSTMETA.Post_ID AS Post_ID, WP_POSTMETA.CustomerLN AS CustomerLN, [table_name2].CustomerFN AS  CustomerFN, [table_name3].Payment_Type AS Payment_Type, [table_name4].Meta_Value AS  Invoice_Total 
    FROM WP_POSTMETA 
    JOIN WP_POSTMETA AS [table_name2] ON WP_POSTMETA.Post_ID = [table_name2].Post_ID 
    JOIN WP_POSTMETA AS [table_name3] ON WP_POSTMETA.Post_ID = [table_name3].Post_ID 
    JOIN WP_POSTMETA AS [table_name4] ON WP_POSTMETA.Post_ID = [table_name4].Post_ID 
    WHERE WP_POSTMETA.Meta_Value =  "CustomerLN"
    AND [table_name2].Meta_Value =  "CustomerFN"
    AND [table_name3].Meta_Value =  "Payment_Type"
    AND [table_name4].Meta_Value =  "Invoice_Total"
    

    Esto generará una salida que puede ser hecho en un view anteponiendo

    CREATE VIEW WP_TRANSACTIONS AS
    

    y esta vista JOINed a WP_POST

    SELECT * FROM WP_POST 
    LEFT JOIN WP_TRANSACTIONS ON WP_POST.Post_ID = WP_TRANSACTIONS.Post_ID