我有一个生成如下结果的查询:
数据按日期 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。
换句话说,我需要做这样的事情:
- 执行上述查询,同时检查 c.private 是否设置为 1。
- 如果 c.private 设置为 1,则使用 c.user_id 从联系人表中获取该用户的“friend_id”。
- 如果请求信息的人的 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/