我一直在搜索互联网和这个论坛,但我仍然无法找到一个快速做到这一点的好方法,特别是没有遇到内存使用问题。这是我的任务:
我在传统的mysql中做了什么:
我有3个表,比方说:table1,table2和table3 我们假设table1有300.000行(例如,它们是购买项) 我们假设table2是产品列表,并且有10,000行 我们假设表3是服务列表,也有10.000行
现在,我需要做的是生成一个报告,列出循环中的每次购买,这将检查购买项目是针对产品还是服务,如果是产品,它将输出名称通过获取table2上的对应名称列来生成产品。如果它是一项服务,也会发生同样的事情......
1)在手册和论坛中,据说我无法在完成阅读所有行的情况下在PDO中运行另一个查询...这就是我需要运行另一个查询来获取产品/服务的名称。 (在mysql中,这非常简单,因为我可以处理许多结果资源,只是使用mysql_result在它们之间进行迭代)
2)有些人说使用fetchall甚至fetch会爆炸我的内存使用量,我无法进行此查询....我已经尝试过获得一个包含所有结果的数组(300K)并且比喻爆炸我的服务器的内存使用...
所以你们可以帮助我吗?我试图将我的服务器移动到Windows azure,他们只允许pdo os sqlsrv .....
好的,有些人在这里问过我的理论代码:
// connect to mysql database
$sql = @mysql_connect("{server}","{login}","{password}");
@mysql_select_db("{database}");
// query:
$result = mysql_query("SELECT * FROM table1 ORDER BY purchase_date ASC");
for($i=0;$i<$num;$i++){
if(mysql_result($result,$i,"purchase_type")==1){
$result1 = mysql_query("SELECT product_name FROM table2 WHERE id='".mysql_result($result,$i,"purchase_type_id")."'");
$name = mysql_result($result1,0,"product_name");
}else if(mysql_result($result,$i,"purchase_type")==2){
$result1 = mysql_query("SELECT service_name FROM table3 WHERE id='".mysql_result($result,$i,"purchase_type_id")."'");
$name = mysql_result($result1,0,"service_name");
}else{
$name = '{error}';
}
echo(($i+1)". ".$name." <br/>");
}
PS:这只是一个示例代码......真正的代码比那更长,更复杂......但如果我能在这里解决理论,我可以弄清楚剩下的...... :)
PS2:在有人要求之前...... table2和table3有不同的列......
谢谢,
答案 0 :(得分:2)
SELECT
table1.*,
COALESCE(table2.product_name, table3.service_name, '{error}') as name
FROM table1
LEFT JOIN table2
ON table1.purchase_type = 1
AND table2.id = table1.purchase_type_id
LEFT JOIN table3
ON table1.purchase_type = 2
AND table3.id = table1.purchase_type_id
ORDER BY table1.purchase_date
请注意,通过让purchase_type_id
引用table2或table3,您会错过外键的一些优点。
答案 1 :(得分:0)
你可以尝试这样的事情(希望它能起作用,我随着时间的推移制作出来):
<?php
// connect to SQLserv database with PDO
$db = new PDO("sqlsrv:server=yourServer; Database=yourDB", "user", "password");
$statement = $db->prepare("SELECT * FROM table1 ORDER BY purchase_date ASC");
$statement->execute();
$main_result = $statement->fetchAll(PDO::FETCH_ASSOC);
$statement->closeCursor();
unset($statement);
$p_type1 = array();
$p_type2 = array();
foreach ($main_result as $row => $column) {
switch ($column["purchase_type"]) {
case 1:
$p_type1[] = $column["purchase_type_id"];
break;
case 2:
$p_type2[] = $column["purchase_type_id"];
break;
}
}
$names = array();
$statement = $db->prepare("SELECT product_name FROM table2 WHERE id = :id");
foreach ($p_type1 as $value) {
$statement->execute(":id" => $value);
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
$statement->closeCursor();
$names[] = $result[0]["product_name"];
}
unset($statement);
$statement = $db->prepare("SELECT service_name FROM table3 WHERE id = :id");
foreach ($p_type2 as $value) {
$statement->execute(":id" => $value);
$result = $statement->fetchAll(PDO::FETCH_ASSOC);
$statement->closeCursor();
$names[] = $result[0]["service_name"];
}
foreach ($names as $key => $value) {
echo "$key. $value<br />\n";
}
?>