我正在尝试创建一个将通过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');
然而它什么也没有回报。有什么可能的建议吗?
答案 0 :(得分:0)
答案 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/