2013-06-15 3 views
0

У меня это заявление:запрессовки SQL заявления

SELECT board.*, numlikes 
FROM board 
LEFT JOIN (SELECT 
       pins.board_id, COUNT(source_user_id) AS numlikes 
      FROM likes 
      INNER JOIN pins ON pins.id = likes.pin_id 
      GROUP BY pins.board_id) likes ON board.id = likes.board_id 
WHERE who_can_tag = '' 
ORDER BY numlikes DESC LIMIT 10 

Но мне нужно также присоединиться к этим двум другим заявления к нему:

SELECT COUNT(owner_user_id) 
FROM repin 
INNER JOIN pins ON pins.id = repin.from_pin_id 
WHERE pins.board_id = '$id' 

и

SELECT COUNT(is_following_board_id) 
FROM follow 
WHERE is_following_board_id = '$id' 

мне удалось получить первый присоединился, но у меня проблемы с остальными, думая, что это может занять слишком много времени.

Есть ли более быстрый способ выполнить?

ответ

1

В идеале, начните с наименьшего набора результатов, а затем начните соединение со следующей наименьшей таблицей.

Вы не хотите, чтобы база данных выполняла полное объединение таблиц в кучу больших таблиц, а затем в конце содержала предложение where, которое удаляет 99% строк только что созданной базы данных.

В Oracle, я делаю:

SELECT * 
    FROM big_table bt 
    JOIN DUAL ON bt.best_filter_column='the_value' 
--now there are only a few rows 
    JOIN other_table_1 ... 
    LEFT JOIN outer_join_tables ... 

Включить все внешние соединения в прошлом, так как они не падают ни одной строки, так что надеюсь, вы уже отфильтрованы много строк.

Смежные вопросы