繁体   English   中英

MySql-进行这种查询的最佳方法

[英]MySql - Best way to do this kind of query

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

因此,例如,我的实际查询是这些(我完成了它的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次。 您对改善这种情况有何建议?

如果表不相关,那么您将不得不进行4次单独的呼叫

如果表可以通过外键关联,那么您可以通过某种方式将它们加入,并可能减少您的sql调用

最终,尽管如果您需要所有数据,则必须从数据库中请求它

您可以使用 UNION 而且,顺便说一句, mysql_result 很差 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'];
}
?>

我真的不建议这样做,因为在同一列中将“计数”值与日期结合起来有点混乱,但是您可以做到。 这是您问题的直接答案。

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

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

例如,INSERT INTO投票(投票,用户投票,...)值(123,'abc',...); 插入myindex(昵称,nvalue,ntable)VALUES('abc',123,'vote');

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

然后在查询中,只需从myindex WHERE nickname ='abc'中选择nvalue,ntable; 您可能会得到不止一排。

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

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

选择..实际上。

也许您应该规范化数据库并在表之间建立链接...

编辑::并且我不确定您如何准备针对MySQL注入,但是要小心$ _SESSION []的来源

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

$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
"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM