2013-08-19 7 views
-1

Могу ли я избежать INNER JOIN в этих запросах?Как оптимизировать эти запросы?

"SELECT posts.status, posts.reports, posts.post_id, 
     posts.reply_counts, posts.sender, posts.content, 
     posts.image, posts.thumb, posts.date, 
     members.username, members.avatar, members.state 
FROM posts 
    INNER JOIN members ON posts.sender = members.member_id 
WHERE posts.parent_id=0 
    AND posts.wall_id=0 
    AND (
      (members.status=".MEMBER_STATUS_ACTIVE." AND 
      posts.reports<".MAX_REPORT_HIDE." 
      AND posts.status=".POST_STATUS_ACTIVE." 
     ) 
     OR 
     ".$bAdmin."=1 
     OR 
      (".$bMod."=1 AND 
      posts.status<>".POST_STATUS_DELETED." 
      ) 
     ) 
    AND posts.private_id=0 
ORDER BY posts.post_id DESC, posts.date DESC 
LIMIT ".(($pagenum-1) * PAGINATION).",".PAGINATION.";" 


"SELECT posts.status, posts.reports, posts.post_id, posts.reply_counts, 
     posts.sender, posts.content, posts.image, posts.thumb, posts.date, 
     members.username, members.avatar, members.state 
FROM posts 
    INNER JOIN members ON posts.sender = members.member_id 
    INNER JOIN notifies ON posts.post_id=notifies.post_id 
WHERE notifies.member_id=".$member_id." AND 
     posts.parent_id=0 AND 
     members.status=".MEMBER_STATUS_ACTIVE." AND 
     posts.reports<".MAX_REPORT_HIDE." AND 
     posts.status=".POST_STATUS_ACTIVE." AND 
     posts.private_id=0 
ORDER BY posts.last_update DESC, posts.date DESC 
LIMIT ".(($pagenum-1) * PAGINATION).",".PAGINATION.";" 
+0

Вопрос: зачем вам это нужно? – Strawberry

+0

Это зависит от вас. Если вам нужны поля 'members', тогда присоединитесь к его таблице. Также я думаю, что вы должны переместить 'members.status =" .MEMBER_STATUS_ACTIVE. "' В предложение 'ON' членов' INNER JOIN' – SAMPro

+0

@Strawberry из-за производительности. – exim

ответ

0

enter image description here

Если вам нужны все строки из таблицы как раз соответствует существуют, то вы должны использовать внутреннее соединение.

+0

Было бы более полезным сказать, что если вы хотите использовать RETRIEVE данные из обеих таблиц AND/OR FILTER, используя данные из каждой таблицы, вы ДОЛЖНЫ использовать соединение. – symcbean

+0

@symcbean Да, что я имею в виду. – overflow