2016-05-17 4 views
0

У меня есть переменная, содержащая динамический запрос. Что-то вроде этого:Как использовать инструкцию SELECT в предложение JOIN?

$query = "SELECT id, subject FROM post1 
      UNION ALL 
      SELECT id, subject FROM post2 
      UNION ALL 
      SELECT id, subject FROM post3"; 

Также у меня есть этот запрос:

SELECT code FROM mytable WHERE id = :id 

Теперь я хочу join запрос выше с этим динамическим запросом. Вот моя попытка:

SELECT t1.code t2.subject FROM mytable t1 
    LEFT JOIN ($query) t2 ON t1.col = t2.id 
WHERE t1.id = :id 

/* 
SELECT t1.code t2.subject FROM mytable t1 
    LEFT JOIN (SELECT id, subject FROM post1 
       UNION ALL 
       SELECT id, subject FROM post2 
       UNION ALL 
       SELECT id, subject FROM post3) t2 ON t1.col = t2.id 
WHERE t1.id = :id 
*/ 

Это работает. Но для огромных данных требуется много времени. Как я могу сделать это быстрее?

ответ

1
SELECT t1.code t2.subject FROM mytable t1 
    LEFT JOIN (SELECT id, subject FROM post1 
       JOIN mytable tt1 ON tt1.col = post1.id AND tt1.id=:id 
       UNION ALL 
       SELECT id, subject FROM post2 
       JOIN mytable tt2 ON tt2.col = post2.id AND tt2.id=:id 
       UNION ALL 
       SELECT id, subject FROM post3 
       JOIN mytable tt3 ON tt3.col = post3.id AND tt3.id=:id) t2 ON t1.col = t2.id 
WHERE t1.id = :id 

Просто добавьте идентификатор: id ко внутреннему querie4st, чтобы ограничить количество выбранных данных.

+0

ТНХ ........ +1 – Shafizadeh

+0

Может вы сказать мне свое мнение о [этого решения] (http://stackoverflow.com/questions/37270024/how-to-use-a -выбор-заявление-в-нарисуй пункт # 37271046)? – Shafizadeh

+0

Также я думаю, что выбор 'id' в подзапросах является избыточным, я прав? – Shafizadeh

1

Вы можете использовать нижеследующий запрос.

SELECT t1.code, t2.subject FROM (SELECT code, col FROM mytable WHERE id = :id) t1 
LEFT JOIN ($query) t2 ON t1.col = t2.id 
+0

Умный ..... +1 – Shafizadeh

+0

@Shafizadeh Спасибо. Это вызвано оптимизацией запроса. –

+0

col Должен быть в select (SELECT-код, col FROM mytable WHERE id =: id). Но в любом случае внутренний запрос ** t2 ** извлекает все строки, но мы их вообще не нуждаемся. – StanislavL

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