Выбрать в выбрать подзапрос - PullRequest
0 голосов
/ 28 февраля 2012

у меня 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» убивает скорость

Заранее спасибо ...

1 Ответ

1 голос
/ 28 февраля 2012

посмотрите на EXISTS вместо IN.Производительность намного лучше.

select distinct Articles.id, title, descr, thumb, relDate, Articles.alias, Articles.lang, author, source  
from Articles, TagsList 
where
    Articles.lang = 0 OR 
    EXISTS 
          (SELECT *
           FROM LangList 
           WHERE uid= '66' AND active='1' 
           AND langid = Articles.lang)

РЕДАКТИРОВАТЬ: вторая попытка (проверьте, если производительность лучше):

SELECT Articles.*
   FROM Articles 
    INNER JOIN LangList
        ON langid = Articles.lang
   WHERE uid= '66' AND active='1' 

UNION

SELECT Articles.*
FROM Articles
WHERE 
Articles.lang=0
AND
NOT EXISTS
(
    SELECT *
           FROM LangList 
           WHERE uid= '66' AND active='1' 
           AND langid = Articles.lang
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...