2011-11-19 34 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

相關問題