1

我有一张桌子

 unam     fnam

 john     alex
 alex     john

如果 unam 'john' == fnam 'alex' 或 unam 'alex' == fname 'john' 我想要一个返回 true 的查询

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

$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 个单独的查询(一个 forunam 'john' == fnam 'alex'和另一个 for unam 'alex' == fname 'john',如果两个查询都没有任何行,则它回显不存在。

我在想可能是它可以优化为单个查询。

4

5 回答 5

5

您可以执行 OR 条件来检查多个不同的条件。

SELECT 1 
FROM tab 
WHERE (unam='john' and fnam='alex') 
    OR (fnam='john' and unam='alex') 
LIMIT 1
于 2013-07-02T18:17:41.797 回答
2

您可以将逻辑放在这样的where子句中:

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

顺便说一句,如果你想总是返回一个值,比如0or 1,你可以使用聚合:

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

如果没有选择行,则max()返回变成。NULLcoalesce()0

于 2013-07-02T18:18:12.777 回答
2

您可以使用OR语句来实现这一点。

尝试这个:

mysql_query("SELECT 1 
FROM tab 
WHERE 
(unam='john' and fnam='alex') 
OR 
(unam='alex' and fnam='john')
limit 1");
于 2013-07-02T18:20:33.873 回答
1
$re = mysql_query("SELECT COUNT(*) FROM tab WHERE (unam='john' and fnam='alex') OR (unam='alex' and fnam='john')");
于 2013-07-02T18:18:22.233 回答
1

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

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

在此处查看小提琴。

于 2013-07-02T18:25:46.610 回答