2013-04-24 35 views
2

我試圖創建一個查詢,通過DAO返回輸入的用戶名和密碼是否正確。我正在使用Java來實現DAO以及JSF。登錄涉及多個連接的DAO sql語句

我有以下表格:

LOGIN: username (pk) 
BUSINESS: username (fk), password 
CUSTOMER: username (fk), password 

我想要做的就是創建多個連接,因此當用戶去登錄,其存儲的用戶名定義他們有什麼類型的帳戶。通過拉動用戶名,用戶名在BUSINESS和CUSTOMER中都被查找到,並且當找到時,密碼就會被比較。我嘗試了以下聲明:

SELECT l.USERNAME 
FROM ITKSTU.BUSINESS b 
JOIN ITKSTU.LOGIN l 
ON l.USERNAME=b.USERNAME      
JOIN ITKSTU.CUSTOMER c 
ON c.USERNAME=l.USERNAME 
WHERE l.USERNAME='user111' AND (b.PASSWORD='aaa' OR c.PASSWORD='aaa'); 

然而,它什麼都不返回。任何可能的建議?

回答

0

如果我理解正確的話,你需要的是區分用戶類型,他/她是否是在業務表或客戶表。然後,檢查密碼的正確性。

然後,如果我沒有問題,那麼您應該爲登錄表中的所有用戶輸入一個條目,然後每個用戶都應該在商戶或客戶表中執行任何操作。

假設我們有記錄,如:

INSERT INTO login VALUES ('TEST'); 
INSERT INTO login VALUES ('TEST2'); 
INSERT INTO business VALUES ('TEST','PASSWORD123'); 
INSERT INTO customer VALUES ('TEST2','PASSWORD1234'); 

我想你可以用下面的查詢解決問題。讓我們從一個名爲「測試2」的用戶測試:

SELECT b.username AS business_user, c.username AS customer_user 
FROM login l 
LEFT JOIN business b ON b.username = l.username 
LEFT JOIN customer c ON c.username = l.username 
WHERE l.username = 'TEST2' AND (b.password = 'PASSWORD1234' OR c.password = 'PASSWORD1234'); 

這個查詢將返回2列,您注意到:首先作爲用戶是不是在業務表一個將返回null。第二個會給你用戶名,並將其標記爲「customer_user」。因此,如果您檢查每一列並確定哪一列爲空,那麼您將知道用戶實際所屬的位置(無論是業務表還是客戶表)。

這裏的訣竅是從登錄表(「FROM login」)開始,並使用LEFT JOIN而不是JOIN。這裏有一個關於連接及其差異的快速提示,如果您需要它:http://www.firebirdfaq.org/faq93/