rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 数据库 » MySQL

sql用in优化查询

sql用in优化查询 如图做一个收藏功能,可以收藏不同类型的东西。iid表示收藏品id,就是收藏的东西表里的那个自增长id,收藏表favorite如下图:

sql用in优化查询

现在以收藏下载部分为例。

页面开始只有查询列表显示,现在要添加一个删除功能。删除当然要取favorite的id(不要用iid,比如说可能收藏的一个news的id和收藏的一个pic的id是一样的,虽然可以再加上type做限制保证唯一性,但是不推荐这样做,有个自增长id不用干什么呢?)

收藏表有关下载的记录:
$sql = "select * from `favorite` where `uid`={$uid} and `type`='download' order by `ctime` desc";
$fan = Html::getlist($page,10,$sql,'download-list.php?page=',$_db_wedding,"xie-page");

$data = $_db_wedding->fetch_array($fan['result']);
下一步用通过结果集$data里的iid去download表里查询每个收藏的下载的详细信息。

不要拿起就搞个foreach循环$data   然后在里面通过iid弄个查询,很费时间的,连接数据库是最费时的。

以前笨,写成这样:

foreach($data as $val){

$sql="select * from download where id={$val['iid']} limit 1";//id应该是唯一的,加不加limit 1无所谓

$handle=$_db_wedding->query($sql);

if($results=mysql_fetch_array($handle)){

//可能的想法是把download信息全部弄到$data里去,就是注意不要建相同的key

$data['aa']= $results['aa'];

$data['bb']= $results['bb'];

.。。。。。。。

然后在模板页循环取出这个$data,里面啥都有;这种方式最原始,最容易理解。

现在sql里改用in一次性从download表查出所有的被收藏了的记录:

先拼凑一个包含所有iid的字符串:

if(!empty($data)){ foreach($data as $key=>$value){
   $array_id[] = $value['iid'];
} $str_id = implode(',',$array_id);//所有iid

$dsql = "select * from `download` where `id` in ({$str_id}) and `isdel`='n'";
$s_data = $_db_wedding->fetch_array($_db_news->query($dsql));

然后现在头疼了,这样没有favorite表的自增长字段id怎么弄删除?

或许会想到比较$data和$s_data,它们不是有iid和id对应吗?

可能又会想到写一段嵌套循环的代码,想办法把$data里的id塞到$s_data里,然后模板页面循环$s_data:

foreach($data as $k1=>$v1){
   foreach($s_data as $k2=>$v2){     if($v2['id']==$v1['iid']){
    $s_data[$k2]['del_id']=$v1['id'];    }
}

2个foreach似乎也影响速度,再改一下://创建以收藏品id为索引(等于favorite表的iid)的收藏品信息的数组
if(!empty($s_data)){
   foreach($s_data as $key1=>$val1){
    $d_data[$val1['id']] = $val1; } }

模板显示,循环$data,不是循环$s_data:

foreach($data as $key=>$v){

     $downinfo = $d_data[$v['iid']];//循环时动态调用数组
          ?>
        <li style="<?=($kk % 2==1)?"background: none repeat scroll 0% 0% rgb(254, 242, 244);":""?>">
           <h3><span>时间:<?=AtomHtml::getdatetime($downinfo['uptime'])?></span>
            <a><?=AtomHtml::showinput($downinfo['title'])?></a>
           </h3><p><?=AtomHtml::zhcut($downinfo['descript'], 120)?>...</p>
           <b>免费 | 软件大小:<?=AtomHtml::getfilesize($downinfo['file_size'])?> | 人气:<?=$downinfo['downloads']?></b>
           <dl>             <dd class="dd_1"><a href="<?=Url::news('/iframe/iframe-download.php')?>?id=<?=$downinfo['file_name']?>">下载</a></dd>
            <dd class=""> <a href="javascript:void(0);" onclick="favorite.delMyfavor('<?=$v['id']?>','download');" style="text-decoration: underline;color: red;">[删除]</a></dd>
           </dl>
        </li>

<?}?>

不知道能不能用复杂的sql语句把要用的删除id和下载信息一次性查到一个数组里,(还要注意2个自增长字段都叫id),估计写出来看起来也费劲。项目中经常遇到类似从属关系查询,比如博客和博客分类,相片和相册。切忌不要用foreach里面搞查询,自己开发测试看不出来,挂到公网上,人多了,估计就卡死了!不知道有没有更简单的方法。

顶一下
(0)
踩一下
(0)