2011-04-21 69 views
0

我需要編寫一些代碼,以使領班能夠找到他們需要用於不同城鎮工作的瓦工,並根據要完成的瓦工類型進行選擇。MySQL選擇全部WHERE語句 - 需要幫助

我設置了一個名爲USERS的MySQL數據庫表,其中包含每個用戶的所有詳細信息(包括尋找bricklayers和bricklayers自己的人員),例如userid,first_name,last_name等。砌磚工是:傳統的,建築的,鋪路,平板,路由,木板,裝飾和薄紗。我可能不得不在稍後添加更多內容。

我有另一個表(或設置它的計劃)稱爲POSTCODES。這有大約1000個城鎮郵編,每個瓦工類型的專欄。在每個砌磚類型中都會顯示用於每個郵政編碼的每個砌磚工的用戶標識。每個瓦工類型只能顯示1個瓦工。

例如,郵政編碼表列和數據看起來像這樣(或願意):

Postcode, traditional, architectural, pave, slab, routing, plank, decorative, thins 
1003, 21, 34, 78, 98, 34, 77, 21 
1004, 56, 45, 35, 98, 78, 23, 12 
etc 

中的數字21,34,78,98,34,77,21是用戶標識對屬於砌磚工那些用於不同的郵政編碼。例如,如果我需要郵編1003中的一個瓦工,那麼我們需要的瓦工的用戶ID將爲21.如果我需要郵編1003中的鋪砌瓦工,那麼我需要78.如果我需要在郵編1004中的平板瓦工,那麼我會需要98.

要拉他們需要使用的瓦工的記錄我打算使用全選用戶WHERE userid.users = ????這是我卡住的地方?基本上我需要能夠爲相關瓦工用戶提取數據。在上面的例子中,我需要提取數據用於任一用戶21,78或98

形式的人將填補找到合適的瓦工如下:

什麼類型的瓦工你需要? 帶有選項的單選按鈕或下拉菜單: 傳統,建築,鋪路,平板,路由,木板,裝飾,薄皮

Postcode是什麼工作? 然後他們輸入郵編。

下一頁將顯示(希望:)他們需要聯繫和使用的人的詳細信息。

+0

所以不可能永遠只在任何給定的郵政編碼中成爲每種類型的單個瓦工?這似乎不是一個設計得很好的數據庫。 – 2011-04-21 06:32:27

+0

是每個郵編只有一個類型。所以每個郵政編碼都會有7個bricklayers ..想法? – user718359 2011-04-21 06:37:56

+0

基本上它不是一個可供選擇的磚瓦列表,而是他們必須使用的列表。 – user718359 2011-04-21 06:44:38

回答

1

從它的聲音你沒有太多的PHP或MySQL的經驗。這是SQL 101.它聽起來像你的Schema是一個完整的混亂。這是你應該有什麼(基本僞代碼):

TABLE users (
id PK, 
name, 
... 
); 

TABLE types (
id PK, 
name 
); 

TABLE postcodes (
code PK, 
location_name, 
... 
); 

TABLE bricklayers (
user_id FK to users, 
type_id FK to types, 
code FK to postcodes 
) PK (type_id, code); 

現在,瓦工的PK將類型瓦工每個郵編的數量限制爲1,這意味着你將只能得到每類每一個郵政編碼。

要獲得誰是在一個特定的郵遞區號瓦工用戶的列表,我們可以運行:

SELECT * FROM bricklayers WHERE code = {POSTALCODE}; 

這會給你的TYPE_ID和所有瓦工的USER_ID。您可以將選擇與連接耦合,以便從每個表中提取信息,而不僅僅是ID。但是這應該讓你去你想去的地方。

+0

嗯..謝謝你,對我的頭很少..是新手同時擁有MySQL和PHP ..是否明顯:)但慢慢學習..使用DW,它做了很多我通常需要的SQL基本編碼(這實際上並不是很多)..無論如何還是有點困惑.. – user718359 2011-04-21 06:53:19

+0

你認爲這就是它應該如何做了什麼?名爲「類型」的表格確實含糊不清。爲什麼'Type.name'不是一個關鍵字,即不會有不同的'Types'具有相同的'name'會令人困惑?不應該'Brickayers'表中的鍵是'(type_id,code)'?我沒有看到規範中的任何內容,暗示同一個瓦匠不能爲相同的郵政編碼執行多種類型(常識表明這是一種可能的情況)。 – onedaywhen 2011-04-21 09:55:46

+0

感謝您的評論..是的,一個瓦工可以做多種類型.. – user718359 2011-04-21 10:27:34

-1

我建議使用cdburgess的解決方案。但是,如果你仍然想使用你的計劃,你可以使用這樣的查詢

Select * from Users WHERE userid.users IN ( 
    SELECT concat_WS(',', traditional, pave, decorative) as uid FROM `postcodes` WHERE postcode=1003 
) 

添加GROUP BY UID如果你需要在一個時間超過一個以上的郵編搜索

+0

因爲我不是活躍的MySQL用戶,所以我不能確定105%,但我認爲在這裏使用'CONCAT_WS'是不合適的。該函數產生*字符串值*,而不是*整數值列表*。確實,字符串的內容看起來像是一個值列表,但這仍然是一個字符串。你的IN表達式實際上是IN('21,78,77')',在我看來這與'IN(21,78,77)'不一樣。或者我錯過了什麼? – 2011-04-21 07:15:28

+0

對不起,如果我有點愚蠢,但仍然不知道該怎麼做才能解決它? – user718359 2011-04-21 07:27:01