2014-07-18 45 views
0

是否有可能返回执行SELECT查询时匹配的内容?SQL:如何知道SELECT查询中匹配的值是什么?

这是我的选择:

SELECT COUNT(*) 
FROM user 
WHERE username = :username OR email = :email 
EXCEPT 
SELECT COUNT(*) 
FROM user 
WHERE username = :current_username OR email = :current_email 

正如你所看到的,我检查是否有表user现有用户根据所输入的用户名或电子邮件EXCEPT的同一个帐户被记录在。 因此,如果我使用用户名foo登录,当我搜索foo作为用户名等时,它将不会找到匹配项......

到目前为止好!现在,这里是我的问题...

我得到的只是这个SELECT的一些匹配。但是,我怎么知道这是由于用户名或电子邮件匹配?

谢谢

+2

你不能与查询。你可以拆分成多个查询,但老实说,你在这里做什么? –

+0

那是'EXCEPT'如何在sqlite中工作吗?我的意思是,我看到它的方式,它应该为用户名返回'COUNT(*)',除非当前用户名存在完全相同的'COUNT(*)' ;而不是一个减去另一个的“COUNT(*)” – Lamak

回答

1

您构建查询的方式背后的基本概念需要一些调整。答案不在于找出哪一个匹配,而是要改变查询。

具体而言,使用EXCEPT对两个Count查询的结果是无意义的。您不希望匹配两个不同的计数,并且如果它们相等则不显示结果,而是您确实希望在发生EXCEPT之后的计数,而不是之前。这还不够远,但我会在一会儿告诉你。

因此,让我们打开它看向:

SELECT Count(*) 
FROM 
    (
     SELECT username, email 
     FROM user 
     WHERE username = :username OR email = :email 
     EXCEPT 
     SELECT username, email 
     FROM user 
     WHERE username = :current_username OR email = :current_email 
    ) AS X 
; 

然而,这是不必要的复杂。你可以做同样的事情用一个单一的SELECT声明:

SELECT Count(*) 
FROM 
    (
     SELECT username, email 
     FROM user 
     WHERE 
     (
      username = :username 
      OR email = :email 
     ) 
     AND username <> :current_username 
     AND email <> :current_email 
    ) AS X 
; 

但我想建议,即使这可能不是你所需要的查询。总是只有1行返回,在这种情况下,您并不真正需要计数,或者可能会返回多行,在这种情况下,您需要查看返回的内容以便更仔细地检查它。如果您的计数为2,您将如何处理这些信息?所以。

如果可以保证精确的零或一个行会一直被退回,则:

SELECT 1 
WHERE EXISTS (
    SELECT username, email 
    FROM user 
    WHERE 
     (
     username = :username 
     OR email = :email 
    ) 
     AND username <> :current_username 
     AND email <> :current_email 
); 

但如果多行是可能的,则:

SELECT username, email 
FROM user 
WHERE 
    (
     username = :username 
     OR email = :email 
    ) 
    AND username <> :current_username 
    AND email <> :current_email 
; 

随着信息我有现在,我认为别的都没有意义。

0

我想这是你正在尝试做的:

SELECT 'username' as "type", COUNT(*) 
FROM user 
WHERE username = :username AND username <> :current_username 
UNION 
SELECT 'email' as "type", COUNT(*) 
FROM user 
WHERE email = :email AND email <> :current_email 
相关问题