2011-11-19 32 views
2

我产生这样的结果的查询:如何限制访问基于用户联系人表我查询的行IDS

desired output

的数据按日期降序排序,然后通过时间DESC,而且共同的'markers_name'元素被分块在一起。 (他们只在每个日期分组在一起)。

要做到这一点,我得到MAX(time)值的列表中conditions(markers_id, date)每一个组合,然后再加入该列表的行集我从本查询得到,并使用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'设置为1,则只有一些人可以看到查询行。可以看到的人包括创建条件报告的人和该人的联系人。条件表具有'user_id',其中包含创建条件报告的人员的ID。联系人从包含'user_id'和'friend_id'两个字段的'contacts'表中获取。我有请求信息的人的user_id。

要重申的另一种方式,我需要做的是这样的:

  1. 执行上面的查询,也请检查是否c.private被设置为1。
  2. 如果c.private设置为1,则使用c.user_id从联系人表中获取该用户的'friend_id'。
  3. 如果请求信息的用户的user_id与c.user_id匹配或c.user_id的任何朋友返回查询行。如果没有,请不要返回该行或返回表明行是私有的东西(例如,我可以在数据库中使用名称“Private”的标记名称,例如:

如果有人有任何想法, 。很想听到他们的声音我这昨天一整天挣扎谢谢

回答

1

可能只是增加一个过滤器这样就足够了:

… 
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(稍后在客户端或类似情况下处理),则可以将该过滤器用作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 … 
+0

非常感谢您的回复。我只是试过这个,但是我在where子句中出现错误。我会在明天早上尝试调试它,并让你知道我找到了什么。再次感谢。 – user418775

+0

我的错误是由于在$ userid周围没有使用单引号造成的。我尝试了你的第一个答案,它效果很好!感谢您提供有关如何做到这一点的详细信息。 – user418775

1

我没有类似的桌子玩,所以我写这个给你试试,好吗?这里是WHERE条款为你添加到您的查询:

WHERE 
    -- all non-1 valued `private` columns are public, right? remove if not 
    c.private <> 1 
    -- all private but @user_id is entitled to view 
    OR (
     c.private = 1 
     AND (
      (c.user_id = @user_id) -- requestor is creator 
      OR (
       EXISTS (
        SELECT ct.friend_id 
        FROM contacts ct 
        WHERE ct.user_id = c.user_id 
        AND friend_id = @user_id 
       ) -- requestor is a friend of the creator 
       ) 
      ) 
     ) 

同样,我不能对此进行测试。我会离开,你现在..所以,请让我知道如何它走了。:)

+0

谢谢,明天我会出手。 – user418775

+0

我试过这个,它在phpMyAdmin中正常工作(我用104代替'@user_id')。然后我在我的php文件中试过这段代码,它不起作用(我用$ userid替换了'@user_id')。这是我看到的错误:你的SQL语法有错误; ( )( EXISTS( )SELECT ct.req'at line 16 – user418775

+0

我希望我不要进一步混淆事物,但我觉得我应该解释一下,否则你可能会对我的错误感到困惑:你在哪里有ct.friend_id我现在正在使用ct.requestee和你在哪里ct.user_id我有ct.requester。 – user418775

相关问题