mysql - 如何根据用户 ID 的联系人表限制对我的查询行的访问

标签 mysql

我有一个生成如下结果的查询:

desired output

数据按日期 DESC 排序,然后按时间 DESC 排序,但也将常见的“markers_name”元素分块在一起。 (它们只是针对每个日期组合在一起)。

为此,我获取了 conditions(markers_id, date) 的每个组合的 MAX(time) 值列表,然后将该列表加入我从当前查询中获取的行集,并使用 MAX(time) 值进行排序:

SELECT
  m.name AS markers_name,
  c.time AS conditions_time,
  c.date AS conditions_date,
  s.name AS station_name
FROM markers m
  INNER JOIN conditions c ON c.markers_id = m.id
  INNER JOIN station s    ON c.station_id = s.id
  INNER JOIN (
    SELECT
      markers_id,
      date,
      MAX(time) AS time
    FROM conditions
    GROUP BY
      markers_id,
      date
  ) mx ON c.markers_id = mx.markers_id AND c.date = mx.date
ORDER BY
  c.date DESC,
  mx.time DESC,
  m.name DESC,
  c.time DESC

现在我需要限制用户对某些行的访问。
条件表有一个“私有(private)”列。如果 'private' 设置为 1,则只允许某些人查看查询行。可以看到它的人包括创建条件报告的人和那个人的联系人。条件表有一个“user_id”,其中包含创建条件报告的人员的 ID。联系人是从“联系人”表中获得的,该表有两个字段:“user_id”和“friend_id”。我有请求信息的人的 user_id。

换句话说,我需要做这样的事情:

  1. 执行上述查询,同时检查 c.private 是否设置为 1。
  2. 如果 c.private 设置为 1,则使用 c.user_id 从联系人表中获取该用户的“friend_id”。
  3. 如果请求信息的人的 user_id 与 c.user_id 或 c.user_id 的任何 friend 匹配,则返回查询行。如果不是,则不要返回该行或返回表明该行是私有(private)的内容(例如,我可以在数据库中使用名称为“Private”的 markers_name。

如果有人有任何想法,我很乐意听取他们的意见。昨天我整天都在为此苦苦挣扎。谢谢。

最佳答案

可能只添加这样的过滤器就足够了:

…
WHERE c.Private <> 1
   OR c.user_id = @user_id
   OR c.user_id IN (
     SELECT friend_id
     FROM contacts WHERE user_id = @user_id
   )

其中 @user_id 是请求信息的人的 ID。

这将禁止私有(private)行出现在不适当的输出中。

但是,如果您希望它们存在但被标记为 Private(以便稍后在客户端中处理或类似的事情),您可以将该过滤器用作SELECT 子句中的列:

SELECT
  NOT (
    c.Private <> 1
    OR c.user_id = @user_id
    OR c.user_id IN (
      SELECT friend_id
      FROM contacts WHERE user_id = @user_id
    )
  ) AS IsPrivate,
  …
FROM …

关于mysql - 如何根据用户 ID 的联系人表限制对我的查询行的访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8194634/

相关文章:

mysql - 如何使光标工作并填写列表,过程唯一参数的一行中的值

javascript - 如何使用 codeigniter 将动态输入值插入数据库?

Mysql 按日期分组,列中带有子查询

php - json 返回损坏的数据

php - 我想将域名与网站 URL 相匹配

php - Laravel eloquent find max(date) 以及附加搜索条件

MySQL-Postgres : Wrapping multiple rows into one

mysql - Amazon RDS 中是否可以有 5 个以上的只读副本?

php - 从 Web 表单插入 PDO

mysql - 将图像/blob 添加到 mysql 数据库