现在mysql数据库大概有8000条消息记录,有如下几个索引:pic_news,top_news,index_news,imp_news,值均为1或0,代表“是否为图片新闻、头条新闻、首页新闻,重要新闻”。这时候假若我...
现在mysql数据库大概有8000条消息记录,有如下几个索引:pic_news,top_news,index_news,imp_news,值均为1或0,代表“是否为图片新闻、头条新闻、首页新闻,重要新闻”。
这时候假若我调用三条是图片新闻的新闻时,直接可以用sql语句。
select * from news where pic_news=1 order by news_id desc limit 0,3;
语句倒是挺简单的,不过我觉得这个news表的结构索引用得太多了。所以想把这是个索引统一到一个键:features,值为1,2,3,4及他们之间的组合值(用“,”号分开),“1,2,3,4”分别代表“是图片新闻、头条新闻、首页新闻,重要新闻”。组合值就代表该新闻有多种属性,如"1,2"代表"是图片新闻、头条新闻、"。
问题出现了。假若我查的新闻是只有一个属性,那还是可以用类似的sql语句:select * from news where features=1 order by news_id desc limit 0,3;搞定。
但实际往往一则新闻有多种属性,如可能是图片新闻和重要新闻。所以如果我要查三条是图片新闻的新闻时,就不能用feature="1"这个条件了。
只好考虑循环:程序思路如下
$i=0;$j=0;
$sql="select * from news order by news_id desc limit".$i.",1";
$query=mysql_query($sql);
while($re=mysql_fetch_array($query))
{
$features=explode(",",$re[features]);
if(in_array(1,$features))//判断1是否在这个数组里面
{
echo "" ; //如果是则输出该新闻的相关信息
$j++;
}
$i++;
$sql="select * from news order by news_id desc limit".$i.",1";
$query=mysql_query($sql);
if($j==3) break;//当已经找到最近的三条图片新闻则退出循环
}
第二种方法实现起来是有点麻烦,但看到数据库表news里面这么多键又不爽。麻烦各位大仙们从效率的角度分析那种方法更佳。或者分析下利弊,那种更适合用户的速度。第二种方法可以有何改进不。
另外:都是在首页按这几种属性调用新闻,一般提取10则信息。
展开