2

我正在尝试创建一个查询,该查询将通过 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');

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

4

2 回答 2

0

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

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

谢谢

于 2013-06-05T03:02:54.417 回答
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/

于 2013-06-05T07:29:21.030 回答