2013-07-02 25 views
1

我有一个表到一个查询

unam  fnam 

john  alex 
alex  john 

我想返回true的查询,如果墨西哥国立自治大学“约翰” == fnam“亚历克斯”或墨西哥国立自治大学“亚历克斯” == FNAME“约翰”

我不知道如何在单个查询中做到这一点。 我的代码

$re = mysql_query("SELECT 1 FROM tab WHERE unam='john' and fnam='alex' LIMIT 1"); 
$ir = mysql_query("SELECT 1 FROM tab WHERE unam='alex' and fnam='john' LIMIT 1"); 

if ((!(mysql_num_rows($re))) && (!(mysql_num_rows($ir)))) echo 'not exists'; 

我已执行2个独立的查询(一个用于unam 'john' == fnam 'alex'等为unam 'alex' == fname 'john',如果这两个查询不让它回声任何行不存在。

我想可能是它可以进行优化,以一个单一的查询。谁能帮帮我,谢谢

回答

5

你可以做一个或有条件的检查多个不同的条件。

SELECT 1 
FROM tab 
WHERE (unam='john' and fnam='alex') 
    OR (fnam='john' and unam='alex') 
LIMIT 1 
2

你可以把你的逻辑where子句中是这样的:

select 1 
from tab 
where (uname = 'john' and fname = 'alex') or 
     (fname = 'alex' and uname = 'john') 
limit 1 

顺便说一句,如果你想一直返回一个值,说01,你可以使用聚合:

select coalesce(max(1), 0) as retval 
from tab 
where (uname = 'john' and fname = 'alex') or 
     (fname = 'alex' and uname = 'john') 

如果没有行被选中,则max()返回NULL,其中coalesce()变为0

1
$re = mysql_query("SELECT COUNT(*) FROM tab WHERE (unam='john' and fnam='alex') OR (unam='alex' and fnam='john')"); 
2

您可以使用声明来实现此目的。

试试这个:

mysql_query("SELECT 1 
FROM tab 
WHERE 
(unam='john' and fnam='alex') 
OR 
(unam='alex' and fnam='john') 
limit 1"); 
+1

+1谢谢@sumoanand – niko

1

只是一种不同的方法,使用EXISTS,和不同的语法:

SELECT 
    EXISTS (SELECT NULL FROM names 
      WHERE (unam, fnam) IN (('john', 'alex'),('alex','john'))) 

请参阅小提琴here