2016-05-17 59 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

THX ........ +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应该在选择(选择代码,COL FROM mytable WHERE ID =:ID)。但无论如何,内部查询** t2 **检索所有行,但我们根本不需要它们。 – StanislavL