Considere que tengo dos tablas nombradas como direcciones y clientes mostradas en el siguiente código.

Tabla de clientes:

customer_id, email_address, password, first_name, last_name, shipping_address_id, billing_address_id

Tabla de direcciones:

address table with fields as address_id, customer_id, line1, line2, city, state, zip_code, phone, disabled

Lo que necesito obtener es la dirección de facturación y envío basada en la identificación del cliente.

Algo así como:

first_name | last_name | billing_line_1 | billing_line_2 | billing_state | billing_zip_code | billing_phone | shipping_line_1 | shipping_line_2 | shipping_city | shipping_city | shipping_state | shipping_zip_code | shipping_phone 

Estoy usando algo como:

SELECT customers.first_name, customers.last_name, addresses.line1 ,addresses.line2 
FROM `addresses`INNER JOIN customers 
on addresses.address_id = customers.customer_id

Mi pregunta es:

¿Cómo puedo etiquetar el mismo campo dos veces como billing_line_1 y shipping_line_1 ?

ACTUALIZACIÓN:

En función de la combinación, devuelve ambas direcciones como si repitiera el campo en el extracto de selección, mientras que tanto la dirección de envío como la de facturación se almacenan por separado en base a address_id

0
Naveed Khan 21 oct. 2017 a las 09:52

3 respuestas

La mejor respuesta

Usa el mismo campo como,

SELECT customers.first_name, customers.last_name,billing.line1 as 
billing_line_1,billing.line2 as 
billing_line_2,shipping.line1 as shipping_line_1,shipping.line2 as shipping_line_2  FROM customers 
JOIN addresses AS shipping ON customers.shipping_address_id = shipping.address_id 
JOIN addresses AS billing ON 
customers.billing_address_id = billing.address_id

La demostración de trabajo para la consulta está disponible en

SQL FIDDLE

http://sqlfiddle.com/#!9/61db31/1/0

3
Shijin TR 21 oct. 2017 a las 09:55

Dada

drop table if exists CustomerAddress;

create table CustomerAddress(id int auto_increment primary key,address_id int, customer_id int, line1 varchar(10),line2 varchar(10));
truncate table CustomerAddress;
insert into CustomerAddress (address_id, customer_id, line1,line2) values
(1,1,'b1_1','b1_2'),(2,1,'s1_1','s1_2'),
(1,2,'b2_1','b2_2'),
(2,3,'s3_1','s3_2');

Podría usar la agregación condicional (también conocida como pivote)

SELECT c.customerid, 
         max(case when address_id = 1 then line1 else '' end ) as BillingLine1,
         max(case when address_id = 1 then line2 else '' end ) as BillingLine2,
         max(case when address_id = 2 then line1 else '' end ) as ShippingLine1,
         max(case when address_id = 2 then line2 else '' end ) as ShippingLine2
from customers  c
INNER JOIN Customeraddress a
on a.customer_id = c.Customerid
group by c.customerid;

O múltiples uniones para abordar

SELECT c.customerid,
         a1.line1 as billingline1,a1.line2 as billingline2,
         a2.line1 as shippingline1,a2.line2 as shippingline2
from customers c
left join CustomerAddress a1 on c.customerid = a1.customer_id and a1.address_id = 1
left join CustomerAddress a2 on c.customerid = a2.customer_id and a2.address_id = 2
where a1.address_id is not null or a2.address_id is not null
order by c.customerid
;

En cuanto a cuál es la mejor ejecución, explique y examine los resultados. ENTRE usted debe conducir esto desde el cliente, no desde la dirección.

1
P.Salmon 21 oct. 2017 a las 10:36

Puede usar un alias para ese propósito como:

SELECT customers.first_name, customers.last_name, addresses.line1 AS billing_line_1,addresses.line2 AS shipping_line_1
FROM `addresses` INNER JOIN customers
ON addresses.address_id = customers.customer_id

Aquí obtendría el nombre de la columna con el alias definido después de "AS". Entonces, en el ejemplo anterior, el nombre de la columna direcciones.line1 en la salida sería billing_line_1 y, de manera similar, para direcciones.line2 aparecería como shipping_line_1.

1
SMA 21 oct. 2017 a las 06:56