MySql - 执行此类查询的最佳方式

时间:2011-03-04 13:29:40

标签: mysql

我需要返回一行,其中一些数据来自一些彼此不相关的表格。

因此,例如,我的实际查询就是这些(我用PHP脚本完成了):

$query=mysql_query("SELECT trackid FROM tracklist WHERE usersub='".$_SESSION['nickname']."'",$mydb);
echo mysql_num_rows($query);
$query=mysql_query("SELECT trackid FROM comments WHERE usercom='".$_SESSION['nickname']."'",$mydb); 
echo mysql_num_rows($query);
$query=mysql_query("SELECT vote FROM vote WHERE uservote='".$_SESSION['nickname']."'",$mydb);
echo mysql_num_rows($query);
$query = mysql_query("SELECT datereg FROM users WHERE nickname='".$_SESSION['nickname']."'",$mydb);
echo mysql_result($query,0,'datereg');

但是这将调用MySql服务器4次。 您的建议是什么来改善这种情况?

5 个答案:

答案 0 :(得分:2)

如果表格不相关,则必须进行4次单独的通话

如果表可能与外键相关,那么你可以以某种方式加入它们并可能减少你的sql调用

最终,如果您需要所有数据,那么您将不得不从数据库中请求它

答案 1 :(得分:1)

你可以use一个UNION。而且,顺便说一下,mysql_result is poor。 FFS不要忘记清理您的输入!

<?php
$nickname = mysql_escape_string($_SESSION['nickname']);

$sql = "
  SELECT COUNT(trackid) AS n FROM tracklist WHERE usersub='{$nickname}'
    UNION
  SELECT COUNT(trackid) FROM comments WHERE usercom='{$nickname}'
    UNION
  SELECT COUNT(vote) FROM vote WHERE uservote='{$nickname}'
    UNION
  SELECT datereg FROM users WHERE nickname='{$nickname}'
";

$result = mysql_query($sql, $db);

while ($row = mysql_fetch_assoc($result)) {
   echo $row['n'];
}
?>

我不会真的推荐这个,因为将“计数”值与同一列中的日期相结合有点混乱,但可以执行此操作。这是你问题的直接答案。

答案 2 :(得分:0)

好吧,您可以创建第五个表并将其用作索引。

如果所有值{trackid,vote,datareg}都是整数,则索引表可以包含三列 - 昵称,值和表。将记录添加到其他表之一时,请将相应的记录添加到索引表中。

例如, INSERT INTO投票(vote,uservote,...)VALUES(123,'abc',...); INSERT INTO myindex(昵称,nvalue,ntable)VALUES('abc',123,'vote');

(我实际上不会将表名存储为字符串,而是作为数值存储,但你明白了)

然后在查询中,你只需要选择nvalue,ntable FROM myindex WHERE nickname ='abc'; 您可能会获得多行。

我认为这是很多工作,你最好坚持四个原始查询。

答案 3 :(得分:0)

您是否尝试将select语句组合在一起,如

SELECT ..实际上。

也许您应该规范化数据库并在表格之间设置链接......

编辑::我不确定你是如何准备自己反对mysql注入的,但要注意你的$ _SESSION []来自哪里

答案 4 :(得分:0)

如果所有选择都返回一行:

$query=mysql_query("
    (SELECT trackid FROM tracklist WHERE usersub='".$_SESSION['nickname']."'") as tracklist,
    (SELECT trackid FROM comments WHERE usercom='".$_SESSION['nickname']."'") as trackid, 
    (SELECT vote FROM vote WHERE uservote='".$_SESSION['nickname']."'") as vote,
    (SELECT datereg FROM users WHERE nickname='".$_SESSION['nickname']."'") as datereg
"