公司表 gs
产品表 cp gs表
id name
1 中国移动
2 伊利集团
3 康师傅集团
4 可口可乐公司
cp表id name link
1 139手机卡 1
2 双网手机 1
3 纯牛奶 2
4 早餐奶 2
5 晚上好奶 2
6 冰红茶 3
7 方便面 3
8 可口可乐 4
9 醒目 4
10 雪碧 4
————————————————————————————————————————————————
最终想显示成这个样式中国移动
139手机卡 双网手机伊利集团
纯牛奶 早餐奶 晚上好奶康师傅集团
冰红茶 方便面可口可乐公司
可口可乐 醒目 雪碧——————————————————————————————————————————————————我现在采用了这个代码$sql = "SELECT * FROM gs ORDER BY id DESC LIMIT 1,50";
$result = mysql_db_query($dbname, $sql);
while ($row=mysql_fetch_array($result)){echo $row[name]."<br>";
$jobsql = "SELECT * FROM cp WHERE link=$row[id] ORDER BY id DESC LIMIT 1,3";
$jobresult = mysql_db_query($dbname, $jobsql);
while ($row=mysql_fetch_array($jobresult)){
echo $row[name];
}
} 当显示50个产品时候,就相当于访问数据库50x3=150次,系统显示效率很慢了,请问如何解决执行效率问题呢?请高手给一个好的解决方案,并结合给出的数据逻辑关系恩赐代码,谢谢!
产品表 cp gs表
id name
1 中国移动
2 伊利集团
3 康师傅集团
4 可口可乐公司
cp表id name link
1 139手机卡 1
2 双网手机 1
3 纯牛奶 2
4 早餐奶 2
5 晚上好奶 2
6 冰红茶 3
7 方便面 3
8 可口可乐 4
9 醒目 4
10 雪碧 4
————————————————————————————————————————————————
最终想显示成这个样式中国移动
139手机卡 双网手机伊利集团
纯牛奶 早餐奶 晚上好奶康师傅集团
冰红茶 方便面可口可乐公司
可口可乐 醒目 雪碧——————————————————————————————————————————————————我现在采用了这个代码$sql = "SELECT * FROM gs ORDER BY id DESC LIMIT 1,50";
$result = mysql_db_query($dbname, $sql);
while ($row=mysql_fetch_array($result)){echo $row[name]."<br>";
$jobsql = "SELECT * FROM cp WHERE link=$row[id] ORDER BY id DESC LIMIT 1,3";
$jobresult = mysql_db_query($dbname, $jobsql);
while ($row=mysql_fetch_array($jobresult)){
echo $row[name];
}
} 当显示50个产品时候,就相当于访问数据库50x3=150次,系统显示效率很慢了,请问如何解决执行效率问题呢?请高手给一个好的解决方案,并结合给出的数据逻辑关系恩赐代码,谢谢!
应该还有更优化的方法,抛砖引玉了~<?php
$sql_1 = "SELECT * FROM `gs`";
$result_1 = mysql_query($sql_1);$arrGsInfo = array();
//生成公司ID-公司名对应的一维数组
while ($row = mysql_fetch_array($result_1)) {
$arrGsInfo[$row['id']] = $row['name'];
}$sql2 = "SELECT * FROM `cp` ORDER BY `id` DESC LIMIT 50;
$result2 = mysql_query($sql2);$arrCpInfo = array();
$arrGs_Cp = array();
//生成两个数组,$arrCpInfo[]的键->对关系是 产品ID -> 产品名称,$arrGs_Cp保存 公司ID -> 产品ID
while ($row = mysql_query($result2)) {
$arrCpInfo[$row['id']] = $row['name'];
$arrGs_Cp[$row['link']][] = $row['id'];
}//遍历数组,输出//
while ($key_gs = key($arrGs_Cp)) {
echo $arrGsInfo[$key_gs]."<br />";
while ($key_cp = key($arrGs_cp[$key_gs])) {
echo $arrCpInfo[$key_cp]." ";
next($arrGs_cp[$key_gs]);
} next($arrGs_Cp);
}
?>
$sql = "SELECT * FROM gs ORDER BY id DESC LIMIT 1,50";这一句的LIMIT限制的作用是从第二条记录开始的50行记录,偏移量(offset)是从0开始取的。$jobsql也是一样。
<?phpmysql_connect('server', 'username', 'password') or die('Could not connect server:' . mysql_error());
mysql_select_db('database') or die ('Can\'t use database : ' . mysql_error());//'--公司表[gs]缓存,如果缓存不存在\该表更新,则更新缓存
if ('缓存文件存在'){
require_once('缓存文件');
}
else{
$result = mysql_query("SELECT * FROM gs ORDER BY id DESC");
$cacheg = array();
while ($row = mysql_fetch_assoc($result)) {
$cacheg[] = $row;
//'--其他特殊处理
}
file_put_contents('$cacheg=' . var_export($cacheg, true) . ';', '缓存文件');
unset($result, $row);
}
//'--产品表[cp],如果需要缓存则同上
$result = mysql_query("SELECT * FROM gs ORDER BY id DESC LIMIT 1,3");
$cachec = array();
while ($row = mysql_fetch_assoc($result)) {
//'--以公司id|产品link为索引映射关系
$cachec[$row['link']][] = $row;
}
unset($result, $row);//遍历打印
if ($cacheg && is_array($cacheg)){
foreach($cacheg as $key=>$val){
//ob_start();
echo("{$val}<BR />\n"); $cachecOne = $cachec[$key];
if ($cachecOne && is_array($cachecOne)){
foreach($cachecOne as $keyc=>$valc){
echo("{$val['name']} ");
}//End foreach For cachec
}
echo("<BR /><BR />\n\n");
}//End foreach For cacheg
unset($cacheg, $key, $val, $cachecOne, $keyc, $valc);
}?>
[/php]
<?php
mysql_connect('server', 'username', 'password') or die('Could not connect server:' . mysql_error());
mysql_select_db('database') or die ('Can\'t use database : ' . mysql_error());//'--公司表[gs]缓存,如果缓存不存在\该表更新,则更新缓存
if ('缓存文件存在'){
require_once('缓存文件');
}
else{
$result = mysql_query("SELECT * FROM gs ORDER BY id DESC");
$cacheg = array();
while ($row = mysql_fetch_assoc($result)) {
$cacheg[] = $row;
//'--其他特殊处理
}
file_put_contents('$cacheg=' . var_export($cacheg, true) . ';', '缓存文件');
unset($result, $row);
}
//'--产品表[cp],如果需要缓存则同上
$result = mysql_query("SELECT * FROM gs ORDER BY id DESC LIMIT 1,3");
$cachec = array();
while ($row = mysql_fetch_assoc($result)) {
//'--以公司id|产品link为索引映射关系
$cachec[$row['link']][] = $row;
}
unset($result, $row);//遍历打印
if ($cacheg && is_array($cacheg)){
foreach($cacheg as $key=>$val){
//ob_start();
echo("{$val}<BR />\n"); $cachecOne = $cachec[$key];
if ($cachecOne && is_array($cachecOne)){
foreach($cachecOne as $keyc=>$valc){
echo("{$val['name']} ");
}//End foreach For cachec
}
echo("<BR /><BR />\n\n");
}//End foreach For cacheg
unset($cacheg, $key, $val, $cachecOne, $keyc, $valc);
}?>
GROUP_CONCAT(c.name ORDER BY c.id ASC SEPARATOR ',') AS cnames ,
GROUP_CONCAT(c.id ORDER BY c.id ASC SEPARATOR ',') AS cids
FROM gs g
LEFT JOIN cp c
ON g.id = c.link
GROUP BY c.link
ORDER BY g.id DESC
LIMIT 0,50呵呵 这样行不行~~
php循环遍历mysql查询结果集的时候判断下qs.name是否和上一次的qs.name是否相同就可以了。$qs_name = "";
while ($row = mysql_fetch_array($res))
{
if ($row['name2'] == $qs_name)
{
...... //打印name1;
}
else
{
......//打印name2;
......//打印name1;
$qs_name = $row['name2'];
}
}打印换行和空格你自己处理下就可以了