我的页面的一部分我有很多小的小查询,可能大约有6个,从不同的表中获取数据。举个例子:
$sql_result = mysql_query("SELECT * FROM votes WHERE voted_on='$p_id' AND vote=1", $db);
$votes_up = mysql_num_rows($sql_result);
$sql_result = mysql_query("SELECT * FROM votes WHERE voted_on='$p_id' AND vote=0", $db);
$votes_down = mysql_num_rows($sql_result);
$sql_result = mysql_query("SELECT * FROM kids WHERE (mother_id='$p_id' OR father_id='$p_id')", $db);
$kids = mysql_num_rows($sql_result);
如果这些都是在一个查询中抓取以保存到数据库的行程会更好吗?一个查询优于6不是吗?
它会是某种JOIN还是UNION?
答案 0 :(得分:0)
它不是查询次数,而是您传输的有用数据量。如果您在localhost上运行数据库,最好让sql引擎解决查询而不是计算其他程序的结果。如果你在考虑谁应该更加忙碌,那就一样。 Apache或mysql:)
当然你可以使用一些条件:
SELECT catName,
SUM(IF(titles.langID=1, 1, 0)) AS english,
SUM(IF(titles.langID=2, 1, 0)) AS deutsch,
SUM(IF(titles.langID=3, 1, 0)) AS svensk,
SUM(IF(titles.langID=4, 1, 0)) AS norsk,
COUNT(*)
FROM titles, categories, languages
WHERE titles.catID = categories.catID
AND titles.langID = languages.
从MYSQL Bible中使用的例子:)
答案 1 :(得分:0)
如果你真的想减少查询数量,你可以把前两个放在一起:
$sql_result = mysql_query("SELECT * FROM votes WHERE voted_on='$p_id'", $db);
while ($row = mysql_fetch_array($sql_result))
{
extract($row);
if ($vote=='0') ++$votes_up; else ++$votes_down;
}
答案 2 :(得分:0)
连接表的想法是,这些表之间应该有一些东西(例如,关系)。
同样适用于UNION SELECTS,它们是首选的。
如果您希望将来您的解决方案干净且可扩展,我建议您使用mysqli,而不是PHP的mysql模块。
请参阅:mysqli::multi_query。有OOP变体,您可以在其中创建mysqli对象并将该函数作为方法调用。
然后,您的查询应如下所示:
// I use ; as the default separator of queries, but it might be different in your case.
// The above could be set with sql statement: DELIMITER ;
$query = "
SELECT * FROM votes WHERE voted_on='$p_id' AND vote=1;
SELECT * FROM votes WHERE voted_on='$p_id' AND vote=0;
SELECT * FROM kids WHERE (mother_id='$p_id' OR father_id='$p_id');
";
$results = mysqli_multi_query($db, $query); // Returns an array of results
答案 3 :(得分:0)
更少的查询(通常,并非总是)更好,但它也是为了保持您的代码足够清晰,以便其他人可以理解查询。例如,在您提供的代码中,将前两个保持在一起,并将最后一个分开。
$sql_result = mysql_query("SELECT vote, COUNT(*) AS vote_count
FROM votes
WHERE voted_on='$p_id'
GROUP BY vote", $db);
以上将返回两行,每行包含投票值(0或1)和值的投票计数。