2010-07-23 92 views
1

我有4個表(在下面進行說明),並需要:MySQL的選擇,並在那裏過幾個表(很棘手)

  1. 得到3房近10個聊天沒有被禁止用戶
  2. 秀fromuserid
  3. 暱稱
  4. 隱藏用戶$用戶ID不喜歡看錶 「HIDE」

表1 「聊天」

ID(autoinc) fromuserid roomid text 
1    23   3  bla 
2    14   1  bla 
3    11   3  bal 

表2「用戶」 /短路/

ID(autoinc) nickname banned 
1    chris  0 
2    paul   1  // 1 = banned 

表3「隱藏」

ID(autoinc) orguser hideuser 
1    12   3 
2    33   12 

現在,我用PHP程序解決了這個問題,但我必須要經過每一個結果,並始終一個新的查詢,需要太長時間;

$userid = 1; // actual user 

    // List all chats and show userid as nickname 
    $sql_com = "SELECT user.id, user.nickname, chats.text, chats.id ". 
     " FROM chats, user". 
     " WHERE ". 
     " chats.fromuserid = user.id ". 
     " AND chats.roomid = 3 ". 
     " AND user.banned != 1 ". 
     " ORDER BY chats.id DESC"; 
    $result = mysql_query ($sql_com);  

    $count = 0; 
    while ($row = mysql_fetch_array($result, MYSQL_NUM)) 
    { 
     $dontshow = false; 

     // Filter : dont show users $userid dont like to see (table "hide") 
     $sql_com2 = "SELECT id from hide WHERE ((orguser = ".$userid.") AND (hideuser = ".$row[0].")) "; 

     if ($result2 = mysql_query ($sql_com2)) 
     { 
      if (mysql_num_rows($result2) > 0) $dontshow = true; 
     }  


     // Output  
     if ($dontshow == false) 
     { 
      $count++; 
      echo "Nickname: ".$row[1]." Text: ".$row[2]; 
     } 

     if ($count > 10) break; 
} 

Btw。我已經提出了一些改進,所以實際的問題可能不適合所有的答案(感謝您的幫助,直到現在)

最後它現在只是要整合過濾器「不顯示人列在表」隱藏「我的實際用戶」。

+0

THX ...我複習以前所有的問題現在:) – 2010-07-23 11:16:29

回答

1

我想你需要沿着這些線路一般的東西。我已經做了與你的問題略有不同。而不是獲得前10名,然後刪除記錄。它獲得了不會被隱藏的前10個記錄。

SELECT c.ID, c.fromuserid, c.roomid, c.text, u.nickname 
FROM chats c 
JOIN user u ON c.fromuserid = u.id 
where c.roomid = 3 AND user.banned = 0 
AND NOT EXISTS(
       SELECT * FROM hide h 
       WHERE h.hideuser = c.fromuserid 
       AND orguser = $userid) 
ORDER BY c.ID DESC 
LIMIT 0,10 
+0

wohhhh!看起來很驚人,直到現在:)非常感謝。我將不得不做一些測試,但看起來不錯:) – 2010-07-23 18:07:15

+0

測試user.banned = u.banned ..多數民衆贊成在所有..運行完美。 1000謝謝。 – 2010-07-23 18:31:35

-1

雖然我不能馬上找到一個簡單的方法來回答你的問題是,是,我可以爲你指明正確的方向:

http://dev.mysql.com/doc/refman/5.0/en/subqueries.html

使用子查詢應該讓你去和選擇被阻止和隱藏的表,並在原始查詢中使用這些表。

1

未經測試,但它會是這樣的:

$sql_com = "SELECT us.id, us.nickname, ch.text, ch.id ". 
      " FROM chats ch, ". 
      " user us, ". 
      " hide hi, ". 
      " banned ba, ". 
      " WHERE ". 
      " us.id != hi.hideuser ". 
      " us.id != ba.user ". 
      " us.id = ch.fromuserid ". 
      " AND ch.roomid = 3 ". 
      " ORDER BY ch.id DESC LIMIT 0,10"; 
+0

只有當有一個條目在禁止奧德隱藏..否則會帶來x倍結果有效。 SOMETHING like ..會很好,你可以重新檢查...我仍在研究 – 2010-07-23 12:04:43