代码之家  ›  专栏  ›  技术社区  ›  ganjan

用较少的数据库查询在mysql表中搜索值?

  •  0
  • ganjan  · 技术社区  · 14 年前

    我在一个mysql表中有一个拥有唯一用户名的用户,但我必须进行测试并执行许多查询才能找到它。我想知道这是不是一个更好的方法来避免对数据库的所有查询。

    user1 user2 user3 , user4 最多30个。

    for ($x=0; $x < 30; $x ++){
    
        $user = "user"; 
        $user .= $x; //generate user1, user2, user3 etc
    
    
        $result=mysql_fetch_object(mysql_query("SELECT * FROM table WHERE ".$user."='".$_SESSION['username']."'"));
        if ($result){
    

    $_SESSION['username'] user30 在这个表中,我做了29个查询 $result

    6 回复  |  直到 14 年前
        1
  •  1
  •   sleepynate    14 年前

    虽然实际上应该只有一个用户列,但可以使用循环来构建一个大查询,而不是执行30个小查询。

    <?php
    $query = "SELECT * FROM table WHERE ";
    foreach(range(1,30) as $num) {
        $query .= " user$num = '{$_SESSION['username']}'";
        if($num < 30) $query .= " OR ";
    }
    print $query;
    $result=mysql_fetch_object(mysql_query($query));
    ?>
    
        2
  •  1
  •   Brian Hooper    14 年前

    正如Johan所说,你需要使你的数据库正常化。这意味着通过创建额外的表来删除重复的列。有很多这样做的例子;也许最典型的是维基百科版本。。。 http://en.wikipedia.org/wiki/First_normal_form

        3
  •  1
  •   OMG Ponies    14 年前

    SELECT t.* 
      FROM table t 
     WHERE '".$_SESSION['username']."' IN (t.user1, t.use2, t.user3, t.user4, t.user5,
                                                             -- rest of the columns in the same pattern
                                                             t.user26, t.user27, t.user28, t.user29, t.user30)
    

    使用1和30个查询之间有很大区别吗?

    是-数据库查询应该被认为是昂贵的。首先,将请求发送到服务器的应用程序代码会带来开销—SQL是通过TCP传输的。查询越小,到服务器的TCP传输越短—在测试单个查询时可能是毫秒或纳秒,但在多用户设置中,这确实可以增加。然后是查询本身的开销—只获取所需内容,这意味着不使用“SELECT*”。或者你为什么要在每次都可以访问数据库的情况下,分别访问30次呢?

    当您处理一个支持您自己(或者可能支持少数人)的系统,并且应用程序和数据库位于同一主机上(VM将是另一回事)时,这种情况很难想象。但是成本加起来了。

        5
  •  0
  •   Johan    14 年前

    您应该有一个名为“user”的列,其中存储用户名。那么您只需要选择一个就可以得到该行:

    "SELECT * FROM table WHERE user='".$_SESSION['username']."'"
    

    如果我明白你的意思。。。每个用户有一个列,这在大约100%的情况下是非常糟糕的设计。只能有一个用户名为值的用户列。

        6
  •  0
  •   tszming    14 年前

    我不知道你为什么要 用户1…用户30

    <?php         
         $selects = array();
         for($i=1; $i<=30; $i++) {
             $selects[] = "SELECT * FROM `table` WHERE user$i = '" . $_SESSION['username']} . "'"; 
         }
    
         $query = join(" UNION ", $selects);
         print $query;
    

    UNION方法是首选的,因为可以使用索引(user1…user30)。