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

时间:2010-08-07 16:22:12

标签: php mysql loops

我有一个用户在mysql表中有他唯一的用户名,但我必须测试并做很多查询才能找到它。我想知道它是否是一种更好的方法来避免对db进行查询。

表格中有多行,其中包含user1user2user3user4等列,最多可达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,我会在$result之前执行29次查询,我可以使用结果。有一个更好的方法吗?无论如何,这有多重要。 1个查询和30个查询的cpu需求有很大差异吗?

6 个答案:

答案 0 :(得分:1)

虽然你应该只有一个用户列,但你可以使用一个循环来构建一个大的查询而不是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));
?>

答案 1 :(得分:1)

正如约翰所说,你需要规范化你的数据库。这意味着通过创建其他表来删除重复的列。有很多例子说明如何做到这一点;也许规范的是维基百科版本...... http://en.wikipedia.org/wiki/First_normal_form

答案 2 :(得分:1)

由于您没有通配搜索,您可以在一个查询中执行此搜索:

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将是另一回事)。但成本确实增加了。

答案 3 :(得分:1)

您需要规范化该数据库。在我做了同样的错误(user_1,...,user_n在一行中)几次后,我学会了规范化,所有与DB相关的事情突然变得容易了一千次。这里介绍:http://en.wikipedia.org/wiki/Database_normalization

答案 4 :(得分:0)

您应该有一个名为“user”的列,您可以在其中存储用户名。然后你只需要一个选择来获得那一行:

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

如果我理解你在这里是正确的...每个用户都有一列,这在大约100%的情况下都是非常糟糕的设计。您必须只有一个用户列,其中包含用户名作为值。

答案 5 :(得分:0)

我不知道您为什么需要在表格中使用 user1 ... user30 ,但无论如何,为了减少查询时间,您可以尝试以下

<?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)。