[英]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.