php sql将多个查询合二为一

时间:2012-01-06 00:10:14

标签: php join union

我的页面的一部分我有很多小的小查询,可能大约有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?

4 个答案:

答案 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)和值的投票计数。