【发布时间】:2012-02-28 15:18:10
【问题描述】:
我有 4 张桌子。用户、文章、Langs、LangList
文章表: ..., uid (Users.id), lang (Langs.id),...
LangList 表: id、uid (Users.id)、langid (Langs.id)
我想选择指定用户的所有文章(例如,Users.id = 66),在他选择的语言列表中。
如果我这样做:
function FindActiveLangs($lang){
$sql ="SELECT langid FROM LangList WHERE `uid`= '66' AND `active`='1';";
$rsd = mysql_query($sql);
$lang_string = " ( ".$lang."lang = '0' ";
while($row = mysql_fetch_array($rsd)){
$lang_string .= " OR ".$lang."lang = '".$row['langid']."' ";
}
$lang_string .= " ) ";
return $lang_string;
} //end of FindActiveLangs
$tables = " Articles ";
$lang_string = FindActiveLangs("Articles.");
$where1 = "WHERE ".$lang_string." ";
$sql = "select distinct Articles.id, title, descr, thumb, relDate,
Articles.alias, Articles.lang, author, source
from ".$tables.$where1." and Users";
我在 0.01-0.03 秒内得到结果
第二种方式,我认为更适合简洁的代码:
$sql = "select distinct Articles.id, title, descr, thumb, relDate,
Articles.alias, Articles.lang, author, source
from Articles
where lang IN
(SELECT langid FROM LangList WHERE uid= '66' AND active='1')";
我在 1.1-1.3 秒内得到结果
有没有办法执行这个查询,第二种方式性能更好? “IN”会扼杀速度
提前谢谢...
【问题讨论】:
-
Articles 和TagsList 之间没有连接。我不使用 MySql,但在我看来它会产生交叉连接。另外,我没有看到 TagsList 中的任何列被使用。
-
我忘了删除TagsList,这个查询比这个更高级,我只是为了我遇到的问题重写了它,抱歉现在它已经更新了。