2017-10-21 15 views
0

考慮我有兩個表,名稱分別爲地址客戶顯示在下面的代碼中。使用mysql檢索地址的最佳方式

客戶表:

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

地址表:

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

我需要得到的是基於客戶ID的帳單和送貨地址。

喜歡的東西:

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 

我使用的是這樣的:

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

我的問題是:

我怎樣才能標註相同的字段兩倍billing_line_1shipping_line_1

更新:根據

加入它作爲同一返回兩個地址,如果我在SELECT語句重複場同時兼具運輸和賬單地址是基於ADDRESS_ID分開存放。

+0

使用具有'AS'關鍵字的別名。 – Alexander

+0

表中有1行用於帳單地址,1行用於寄送地址,並且您希望查詢返回爲1行? –

+0

您的查詢看起來不正確,連接應該位於addresses.customer_id = customers.customer_id - 它應該返回n行客戶的所有地址。 –

回答

2

使用相同的字段一樣,

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 

用於查詢的工作演示可在

SQL FIDDLE

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

+0

是,但它同時返回發貨和賬單地址一致,而他們分別存儲基於與ADDRESS_ID –

+0

@NaveedKhan請檢查更新的查詢 – Shin

+0

未知列addresses.address_id錯誤 –

1

您可以使用別名爲目的,如:

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 

在這裏,我會得到列名稱與「AS」後定義的別名。因此,在上面的示例中,輸出中的addresses.line1列名稱爲billing_line_1,地址類型也如此.line2將以shipping_line_1的形式出現。

+0

是的,但它返回的貨運和帳單地址都相同,而它們是根據address_id單獨存儲的 –

1

鑑於

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'); 

你可以使用條件聚合(又名樞)

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; 

或多個連接來解決

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 
; 

至於哪個是最佳運行解釋和檢查結果。順便說一句,你應該從客戶驅動而不是從地址。