2014-01-17 14 views
0

我在MYSQL中有兩個表,其中一個包含客戶可以從中選擇的選項列表,另一個包含選項的成本。我想要一個可以返回每個客戶選項集的成本的觀點。就我的例子而言,我會用購買新車的類比。MYSQL Query列名到另一個表中的行

Customers表

customer - sunroof - mag_wheels - spoiler 
-------------------------------------------------- 
John  - true - true  - false 
Steve - false - true  - false 
Lucy  - false - false  - false 

選項表

option  - price 
----------------- 
sunroof  - 100 
mag_wheels - 150 
spoiler  - 75 

期望的結果

customer - cost 
----------------- 
John  - 250 
Steve  - 150 
Lucy  - 0 

或本會做,因爲我好輕鬆乘以價格選擇,然後按客戶

customer - option  - selected - price 
------------------------------------------ 
John  - sunroof - true  - 100 
John  - mag_wheels - true  - 150 
John  - spoiler - false - 75 
Steve  - sunroof - false - 100 
Steve  - mag_wheels - true  - 150 
Steve  - spoiler - false - 75 
Lucy  - sunroof - false - 100 
Lucy  - mag_wheels - false - 150 
Lucy  - spoiler - false - 75 

我一直在困惑這已經好幾個小時了,我甚至無法弄清楚從哪裏開始,一個連接似乎沒有問題,因爲沒有共同的元素可以匹配。我不知道是否使用UNION是答案,但我不知道如何將行值與列標題組合。

如果任何人都可以指出我正確的方向,我會非常感激,如果你想出一個解決方案,動態地選擇不同的選項,所以我可以在未來重新添加更多的查詢。

非常感謝提前。

我希望將所有選項作爲單行使用的原因是我希望使用Access來製作表單來選擇選項,但我無法弄清楚單個表單如何創建多行。

+0

你應該重新設計你的表格。從用戶表中刪除選項 - 它們應該被拆分成它們自己的表:'users - > user_options - > options',之後你可以使用簡單的JOIN操作來完成你想要的東西。 –

+0

我將有一個單獨的用戶表,我只是在選項表中有用戶名,所以我可以區分訂單。查詢看起來如果我有一個單獨的用戶表? – James

+0

http://en.wikipedia.org/wiki/Join_%28SQL%29 –

回答

1

這是一個可怕的數據佈局。您應該有一個關聯表,每個客戶和選項都有一行。

但是,你可以做到這一點:

select c.customer, sum(o.cost) as cost 
from customers c left outer join 
    options o 
    on (c.sunroof = true and o.option = 'sunroof' or 
     c.mag_wheels = true and o.option = 'mag_wheels' or 
     c.spoiler = true and o.option = 'spoiler' 
     ) 
group by c.customer; 

編輯:

你做希望在一個記錄所有選項。相反,你需要一個關聯表:

create table customer_options (
    customer_optionid unsigned auto_increment, 
    customer varchar(255) references customer(name), 
    option varchar(255) references option(option) 
); 

實際上,你應該真的有所有表的整數主鍵,並將它們用於外鍵引用。如果您在問題的輸出中需要數據,那麼只需編寫一個查詢以該格式返回即可。

+0

我很樂意改變佈局,理想情況下我想要一行包含客戶的所有選項,因爲我有一堆表單複選框來設置選項,我無法弄清楚如何讓表單插入多行。 – James

+0

我希望將所有選項作爲單行使用的原因是我希望使用Access來創建選項的表單,並且我無法弄清楚單個表單如何創建多行。我知道圍繞前端的缺點設計模式是不好的... – James

+0

@JamesG。 。 。將數據正確存儲在關係數據庫中。使用查詢將數據提取到Access中,並在應用程序中執行最終格式化。 –

0

查看錶結構,即使我認爲它不可能寫聯接,因爲正如你所提到的,表結構之間沒有關係。

我假設你剛開始這個項目,所以是時候你第一次重新訪問你的數據庫結構並糾正它。

理想情況下,您應該有一個客戶ID與客戶表。 然後你應該有產品ID與產品表。 一張桌子上有客戶購買什麼產品的數據 - 就像customer_products。這將是一對多的關係。因此,客戶1可以有產品1,3和5.這意味着在customer_product中將有三個條目。

然後當你想要做總數時,你可以先加入表顧客,產品基於customer_product,然後做一筆價格也可以得到個人客戶的總金額。

0

糟糕的設計。您必須在有一個客戶表是這樣的:

custumer_id 
customer_name 
other fileds... 

在另一方面,你應該有一個飾品表,你通常描述每個商品

accesory_id 
accesory_name 
supplier_id 
country_of_origin 
other stuff 

也是accesory_price表,其中價格因價格變化而增加。

accesory_id 
price 
active_price 
date_price_added 

的最後,你應與所有的customer_accesory表:

customer_id 
accesory_id 

有了這個,你可以連接的表,並同時選擇客戶籃大小和飾品的顧客的喜好。購物籃大小或每位顧客購買的數量可以總結爲SUM,AVG,COUNT,或者您可以使用GROUP_CONCAT轉動數據以生成高質量的報告。

相關問題