当前位置: 首页 > 面试题库 >

SQL选择行如果其他表中不存在任何行

颜霖
2023-03-14
问题内容

我有一张users桌子和一张likes桌子。向用户显示随机的其他用户数据,并可以决定他喜欢还是不喜欢它。我正在为尚未评级的代理用户选择新的随机用户合作伙伴!

现在,我试图选择likes表中没有行的所有用户,并将执行用户user与已评级用户的关系评级partner

users表是一个标准的用户表,在likes我的列,iduserpartnerrelation

我正在使用Laravel Eloquent,但也可以使用原始sql。

我的尝试:

// $oUser->id is the acting user
$oSearch = Db_User::
              select( 'db_users.*', 'db_likes.*' )
              ->where( 'db_users.id', '<>', $oUser->id )
              ->where( 'db_likes.user', '=', $oUser->id )
              ->where( 'db_likes.relation', '<>', 'dislike' )
              ->where( 'db_likes.relation', '<>', 'like' )
              ->where( 'db_likes.relation', '<>', 'maybe' )
              ->join( 'db_likes', 'db_users.id', '=', 'db_likes.partner' );

这是错误的,因为通过此尝试我没有选择任何新用户。我认为是因为找不到任何行likes!他尚未评分时没有行,因此没有结果。这样对吗?

编辑:

$oSearch = Db_User::
              select( 'db_users.*' )
              ->where( 'db_users.id', '<>', $oUser->id )
              ->where( 'db_users.sex', '=', $strSex )
              ->whereRaw( "not exists ( select 1 from db_likes where db_likes.relation in ('dislike','like','maybe') and db_likes.user = " .$oUser->id . " and db_likes.partner = db_users.id )" );

错误:"{"error":{"type":"Illuminate\\Database\\QueryException","message":"SQLSTATE[42S22]: Column not found: 1054 Unknown column 'IO8fMLYUPHfX1HrwkAWc2xqX' in 'where clause' (SQL: selectdb_users .* fromdb_users wheredb_users .id <> IO8fMLYUPHfX1HrwkAWc2xqX anddb_users.性别= w and not exists ( select 1 from db_likes where db_likes.relation in ('dislike','like','maybe') and db_likes.user = IO8fMLYUPHfX1HrwkAWc2xqX and db_likes.partner = db_users.id ) order by RAND() limit 1)","file":"\/Applications\/MAMP\/htdocs\/adamundeva- server\/adamundeva\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Connection.php","line":625}}"

**

最终解决方案

**

$oSearch = Db_User::
              select( 'db_users.*' )
              ->where( 'db_users.id', '<>', $oUser->id )
              ->where( 'db_users.sex', '=', $strSex )
              ->whereRaw( "not exists ( select 1 from db_likes where db_likes.relation in ('dislike','like','maybe') and db_likes.user = '" .$oUser->id . "' and db_likes.partner = db_users.id )" );

问题答案:

您可以not exists用来选择尚未与某个用户合作的所有用户

select * from
db_users dbu
where not exists (
    select 1 from db_likes dbl
    where dbl.relation in ('dislike','like','maybe') -- not sure if this is necessary
    and dbl.user = $oUser->id
    and dbl.partner = dbu.id
)

http://sqlfiddle.com/#!2/8c3bb9/6



 类似资料:
  • 问题内容: 我有两个postgresql表: 我想获取其中没有一行的每个IP地址。 我尝试了此查询,但它引发了语法错误。 我也想知道此查询(进行调整以使其工作)是否是为此目的性能最佳的查询。 问题答案: 基本上有4种技术可以完成此任务,所有这些技术都是标准SQL。 在Postgres中通常最快。 [](https://www.postgresql.org/docs/current/queries-

  • 我有两个postgresql表: 我想从登录日志中获取每个IP地址,它在IP\U位置中没有一行 我尝试了此查询,但它引发了语法错误。 我还想知道这个查询(通过调整使其工作)是否是用于此目的的性能最好的查询。

  • 我有两个问题: 从表1中选择*,其中my\u值介于值1和值2之间 从表2中选择值1、值2 表2中的value1和value2的集合是唯一的。如何在第一个查询的where语句中插入查询2的所有结果集?

  • 我有一个带有< code>ID主键(自动增量)和唯一列< code>Name的表。如果相同的< code>Name不存在,在MariaDB中有没有一种有效的方法将一行插入到这个表中,否则选择现有的行,并且在这两种情况下,返回具有这个< code>Name的行的ID? 这是Postgres的解决方案。然而,MariaDB似乎没有子句。到目前为止,我尝试的是暴力: 更新:MariaDB 10.5有子句

  • 问题内容: 我想根据某些条件选择一些行,然后从该集合中获取一个条目,并在其前后输入5行。 现在,如果表上有一个主键,我可以用数字方式执行此操作(例如,在数字上,主键比目标行的键小5,而目标行的键的数字多5)。 因此,选择主键为7的行以及附近的行: 但是,如果我仅选择某些行作为开始,则会丢失使用主键的数字方法(并且假设键无论如何在顺序上都没有任何间隙),并且需要另一种方法来获取之前和之后的最接近的行

  • 我有一个名为的表 它有100列:{,,...,} 我了解如何特定列中不包含空值的行,例如: 如何任何列中不包含空值的所有行 但这将在(我正在使用)中返回一个错误