登录DAO sql语句涉及多个join

Posted

技术标签:

【中文标题】登录DAO sql语句涉及多个join【英文标题】:Login DAO sql statement involving multiple joins 【发布时间】:2013-04-18 15:08:54 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

谢谢

【讨论】:

【参考方案2】:

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

然后,如果我没记错的话,您应该在登录表中为所有用户创建一个条目,然后每个用户都应该在业务表或客户表中发生。

假设我们有如下记录:

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/

【讨论】:

以上是关于登录DAO sql语句涉及多个join的主要内容,如果未能解决你的问题,请参考以下文章

反射生成INSERT多个对象的SQL语句

使用ibatis进行查询,我想查询一个字段有多个值得时候的结果,sql语句是这样的

如何在 Laravel Controller 中创建 SQL Join 语句

Access SQL:从插入语句或从 DAO.QueryDef 获取受影响记录的标识值

接口方式[推荐]/动态SQL语句

如何在房间数据库dao中附加两个或多个子查询,而这些子查询存储在变量中