登录涉及多个连接的DAO sql语句

时间:2013-04-24 21:33:48

标签: sql jsf login dao

我正在尝试创建一个将通过DAO返回的查询,无论输入的用户名和密码是否正确。我正在使用java进行DAO实现以及JSF。

我有以下表格:

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

然而它什么也没有回报。有什么可能的建议吗?

2 个答案:

答案 0 :(得分:0)

我在这里复制了相同的内容,看起来它正在运行。你能查一下吗?

http://sqlfiddle.com/#!2/f253d/2

由于

答案 1 :(得分:0)

如果我理解正确,您需要的是区分用户的类型,无论他/她是在商务表还是客户表中。然后,检查密码是否正确。

然后,如果我没有错,你应该为登录表中的所有用户提供一个条目,然后每个用户都应该在商家或客户表中进行。

我们假设我们有以下记录:

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

我认为您可以使用以下查询解决问题。让我们用名为“TEST2”的用户进行测试:

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/