从db

时间:2018-05-15 19:49:49

标签: php mysql sql localhost

我有两张桌子

用户:

id,
username 

app:

userid,
appid,
mainid 

我想显示此表中没有记录的用户。我来自地址mainIdappid。如果我运行此查询

SelectQuery("select  User.UserName
from User
INNER JOIN App
ON User.Id = App.UserId
where App.Mainid!= ".$var_MainId." and App.AppId<>".$var_AppId);

它不会显示可能具有相同useridmainid但不相同appid的用户

2 个答案:

答案 0 :(得分:2)

您可以使用not exists子句。例如,要查找没有使用MainId 123和AppId 456的应用程序条目的用户:

select  u.UserName
from    User u
where   not exists
        (
        select  *
        from    App a
        where   a.UserId = u.Id
                and a.MainId = 123
                and a.AppId = 456
        )

答案 1 :(得分:1)

我建议使用反连接模式。但规范不是很清楚。 (样本数据和预期产出将大大有助于澄清它。)

SELECT u.id
     , u.username
  FROM user u
  LEFT
  JOIN app a
    ON a.userid = u.id
   AND a.mainid <=> ?
   AND a.appid  <=> ?
 WHERE a.userid IS NULL

此查询将返回u中的行,其中a中没有匹配的行,其中包含mainid和appid的指定值。

user表的内容指定为

  id  username
----  --------
   2  foo
   3  fee
   5  fi

app表格为

userid   appid   mainid 
------   -----   ------
     2     444      888
     3     444        1
     3       1      888

如果我们在查询中为appid指定了444,为mainid指定了888,例如

SELECT u.id
     , u.username
  FROM user u
  LEFT
  JOIN app a
    ON a.userid = u.id
   AND a.mainid <=> 444
   AND a.appid  <=> 888
 WHERE a.userid IS NULL

此查询将返回用户3和5.(不会返回用户2,因为app中有一行符合规范。)

还有其他查询模式将返回等效结果。使用NOT EXISTS (correlated subquery)模式可能是最容易理解的模式。