douao1579 2010-07-23 09:51
浏览 30
已采纳

mysql select和几个表的位置(非常棘手)

I have 4 Tables (listed bellow) and need:

  1. get last 10 Chats from Room 3 without banned users
  2. show nickname for fromuserid
  3. HIDE Users $userid dont like to see table "HIDE"

Table 1 "chats"

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

Table 2 "user" /shorted/

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

Table 3 "hide"

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

Right now i solved it with PHP Routine, but I have to go through EACH result and make always a new query, that needs too long;

  $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. I made already some improvments, so the actual question may not fit with all answers (thanks for your help till now)

Finaly its now just about to integrate the filter "dont show people listed in table "hide" for my actual user".

  • 写回答

3条回答 默认 最新

  • dqrfdl5708 2010-07-23 16:24
    关注

    I think you need something along these general lines. I've done it slightly different from your question. Instead of getting the top 10 then removing records. It gets the top 10 records which would not be hidden.

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥15 用windows做服务的同志有吗
  • ¥60 求一个简单的网页(标签-安全|关键词-上传)
  • ¥35 lstm时间序列共享单车预测,loss值优化,参数优化算法
  • ¥15 Python中的request,如何使用ssr节点,通过代理requests网页。本人在泰国,需要用大陆ip才能玩网页游戏,合法合规。
  • ¥100 为什么这个恒流源电路不能恒流?
  • ¥15 有偿求跨组件数据流路径图
  • ¥15 写一个方法checkPerson,入参实体类Person,出参布尔值
  • ¥15 我想咨询一下路面纹理三维点云数据处理的一些问题,上传的坐标文件里是怎么对无序点进行编号的,以及xy坐标在处理的时候是进行整体模型分片处理的吗
  • ¥15 一直显示正在等待HID—ISP
  • ¥15 Python turtle 画图