0

设想

我在这个问题中有三个要素。一个是这种格式的 id 数组:(1,3,5,6,8)。该数组是我要显示的用户 ID 列表。第二个元素是包含用户信息的表格,例如:id name surname email。第三个元素是包含用户配置的第二个表。最后一张表中有两个参数,一个是lid,另一个是usraction(其中重要的是这两个)。lid 代表权限类型和 usraction 值,如果用户希望他的数据是公开的,那么该表上将有一行lid=3usraction="accepted",每次用户更改此权限时,我都会注册操作的日期时间,因此每次更改时都会添加一个新行,为了检索权限的实际状态,我必须为用户检索最后一行像这样检查 usraction 的值:

SELECT * FROM legallog WHERE uid = '.$user['id'].' AND lid = 3 ORDER BY ABS(`registration` - NOW()) LIMIT 1

然后在php中:

if($queryresult && $queryresult[0]['usraction']=='accepted') //display data

问题

在描述了我如何获得当时一个用户设置的权限的实际状态的场景 id 中,现在的问题是我想在一两个 sql 调用中清理一组 id。假设我想打印 4 个用户的用户信息,一个函数给了我这种格式的 id:(2,6,8,1),但是这些用户可能不想显示他们的信息,使用我之前显示的查询我可以为每个用户调用 sql 服务器,然后生成一个新数组,如果授权的用户是 1 和 8,则结果数组将为 (8,1)。

想法是 100 个用户的数组,我将拨打 100 个电话,我不想要这个,有没有办法在一个或两个查询中解决这个问题?

4

3 回答 3

1

像这样的查询可以为您提供所需的信息:

select u.*,
       (select usraction from configuration c where c.userid = u.userid and c.lid = 3 order by datetime limit 1
       ) as lastLid3Action
from users u
where u.userid  in (1,3,5,6,8)

如果您只想要“接受”值,则将其设为子查询:

select t.*
from (select u.*,
             (select usraction from configuration c where c.userid = u.userid and c.lid = 3 order by datetime limit 1
             ) as lastLid3Action
      from users u
      where u.userid  in (1,3,5,6,8)
     ) t
where LastLid3Action = 'Accepted'
于 2013-01-30T16:03:22.873 回答
0

据我了解,您在第一个表中有两个表,用于存储用户信息;第二个表,存储用户权限。并且您想使用第二个表的权限从第一个表中获取信息,那么您需要以下查询:

SELECT a.*
FROM first-table-name AS a
RIGHT JOIN second-table-name AS b a.uid = b.lid
WHERE uid in (1,3,5,6,8) AND usraction='accepted'
ORDER BY ABS)
LIMIT 1
于 2013-01-30T16:07:24.220 回答
-1

您的问题有些含糊,但是如果您问的是当您有一个 id 列表时如何选择多个记录,答案是:

select column, list, goes, here from tablename
where id in (1,5,8,12,413);

这将为您提供仅针对与您的 id 数组匹配的记录列出的列的值。

于 2013-01-30T14:29:43.863 回答