我需要返回一行,其中一些数据来自一些彼此不相关的表格。
因此,例如,我的实际查询就是这些(我用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次。 您的建议是什么来改善这种情况?
答案 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
"