我有一个用户在mysql表中有他唯一的用户名,但我必须测试并做很多查询才能找到它。我想知道它是否是一种更好的方法来避免对db进行查询。
表格中有多行,其中包含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
,我会在$result
之前执行29次查询,我可以使用结果。有一个更好的方法吗?无论如何,这有多重要。 1个查询和30个查询的cpu需求有很大差异吗?
答案 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)
是 - 数据库查询应该被认为是昂贵的。首先,将请求发送到服务器的应用程序代码涉及到开销 - 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)。