2015-08-24 85 views
0

我遇到了一個難以找到解決方法的問題。我正在和MySQL一起工作,看看它是否適合我工作的公司,到目前爲止我對它的能力感到非常興奮。然而,我遇到了一個障礙,我希望有人能幫助我!MySQL根據來自第二個表的匹配信息從表中選擇信息

我在我的數據庫中有兩個表格,一個用於承包商,另一個用於貸款號碼。我的承包商表格中保存着他們的姓名,聯繫方式以及他們願意從事的工作領域等信息。這些區域由(縣,州)格式化,並且如果有多個,則它們如下分開:

Anne Arundel,MD; Baltimore,MD; Calvert,MD;

但是,有些承包商願意在整個州進行工作。還有另一列標記爲這種情況的狀態,它的格式如下:

VA; OH; PA;

我的貸款表包含一個貸款編號,像上面這樣的(縣,州)(但是對於任何給定的貸款只有一個入口)以及第三個狀態列是多餘的並且可能被取出。

我一直在寫一個程序來管理我們所有的承包商和貸款編號,我需要能夠生成一個可用於任何給定貸款編號的承包商列表。以下是我迄今爲止使用的查詢:

SELECT first_name, last_name FROM contractors INNER JOIN loans ON contractors.county_state LIKE CONCAT('%', loans.county_state, ';%') WHERE loans.loan_number = <LOAN NUMBER GOES HERE> 

這很好用,但它無法匹配覆蓋整個州的承包商。我如何在其中放置類似於OR條款的內容,其中包括全州覆蓋承包商?

OR contractors.states LIKE CONCAT('%', loans.state, ';%') 

是這樣的可能嗎?還是我必須改變方向?

在此先感謝您的幫助!

+1

是的,好像你可以像這樣做'OR',但要小心你需要用分號來跟隨州名。在你的第二份列表(VA; OH; PA)中,沒有尾隨的分號。您最好將這些狀態作爲離散記錄存儲在單獨的關係表中。 – Marc

+0

@Marc其實,那裏應該有另一個尾隨的分號。我沒有意識到我排除了它!我會繼續測試它。似乎我在嘗試時遇到了一些錯誤,儘管...... OR子句只是坐在查詢的最後? – Typhon01

+0

我建議你正確地規範你的數據庫設計,將承包商的狀態轉移到每個承包商/州一行的單獨表格中 – Kickstart

回答

0

您可以使用名爲FIND_IN_SET的函數來查找逗號分隔值列表中的值。在這種情況下,您將不得不更換;

SELECT first_name, last_name 
FROM contractors 
INNER JOIN loans 
ON contractors.county_state LIKE CONCAT('%', loans.county_state, ';%') 
OR FIND_IN_SET(contractors.county_stat, REPLACE(loans.states, ';', ',')) 
WHERE loans.loan_number = <LOAN NUMBER GOES HERE> 

這會不會是有效的,雖然,有其他問題(如需要,評估您的域接受美國的人數最多,並且不能夠使用索引來訪問數據很快)。將數據拆分成單獨的表中的多行會更好

0

好吧,事實證明,我只是把我的OR子句放置不正確......感謝Marc和Lukos的幫助!最終代碼看起來是這樣的:

Select first_name, last_name FROM contractors INNER JOIN loans ON contractors.county_state LIKE CONCAT('%', loans.county_state, ';%') OR contractors.states LIKE CONCAT('%', <STATE TO MATCH GOES HERE>, ';%') WHERE loans.loan_number = <LOAN NUMBER GOES HERE>; 

我解析通過我一直在開發程序我的最終狀態部分,但它的工作原理就像一個魅力。再次感謝大家!

相關問題