公司表   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次,系统显示效率很慢了,请问如何解决执行效率问题呢?请高手给一个好的解决方案,并结合给出的数据逻辑关系恩赐代码,谢谢!

解决方案 »

  1.   

    可以一次查询出所有的结果,再生成PHP数组,再输出,这样的话,数据库搜索以PHP数组遍历代替。。
    应该还有更优化的方法,抛砖引玉了~<?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]."&nbsp;";
        next($arrGs_cp[$key_gs]);
      }  next($arrGs_Cp);
    }
    ?>
      

  2.   

    另外,不知道楼主你是不是故意这样写的:
    $sql = "SELECT * FROM gs ORDER BY id DESC LIMIT 1,50";这一句的LIMIT限制的作用是从第二条记录开始的50行记录,偏移量(offset)是从0开始取的。$jobsql也是一样。
      

  3.   

    [php]
    <?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']}&nbsp;&nbsp;");
                }//End foreach For cachec
            }
            echo("<BR /><BR />\n\n");
        }//End foreach For cacheg
        unset($cacheg, $key, $val, $cachecOne, $keyc, $valc);
    }?>
    [/php]
      

  4.   


    <?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']}&nbsp;&nbsp;");
                }//End foreach For cachec
            }
            echo("<BR /><BR />\n\n");
        }//End foreach For cacheg
        unset($cacheg, $key, $val, $cachecOne, $keyc, $valc);
    }?>
      

  5.   

    晕,居然还打错了,echo("{$val['name']}&nbsp;&nbsp;");把里面的$val改为$valc
      

  6.   

    SELECT   g.*  ,
    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呵呵 这样行不行~~
      

  7.   

    加个HAVING COUNT(*) <= 3
      

  8.   

    Meteorlet ,HAVING   COUNT(*)   <=   3 ,应该加哪里呢?
      

  9.   

    ……晕。就一个简单的联合查询就可以完成吧:select cp.name as name1, qs.name as name2 from cp left join qs on cp.link = qs.id order by cp.link;
    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'];
        }
    }打印换行和空格你自己处理下就可以了