嵌套的SELECT挂起了我的SQL语句

时间:2016-09-06 13:05:52

标签: mysql

我正在运行一份声明,从三个表中选择股票市场数据。该语句的最后一部分是在一个表上运行SELECT max(date),该表包含已过时的库存数据行。我需要此表中所选股票的最后日期(tbl_asxd_extended.date)。问题是声明只是悬而未决,我无法解决原因。

如果我将语句分开,直到最后的SELECT并独立运行它们运行正常!他们只是在合并时不能很好地合作。

我不确定如何解决这个问题。

SELECT tbl_asxd_extended.close, tbl_asxd_extended.mcapintra, tbl_asxco.industry, tbl_asxco.company, tbl_watchlist.* 
FROM tbl_watchlist 
INNER JOIN tbl_asxco ON tbl_asxco.symbol = tbl_watchlist.symbol 
INNER JOIN tbl_asxd_extended ON tbl_asxd_extended.symbol = tbl_watchlist.symbol 
WHERE user_email='testuser@test.com' 
  AND tbl_asxd_extended.date = 
     (SELECT max(tbl_asxd_extended.date) FROM tbl_asxd_extended 
      WHERE tbl_watchlist.symbol = tbl_asxd_extended.symbol) 

这是一个' EXPLAIN'声明

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   PRIMARY     tbl_watchlist   ALL     NULL    NULL    NULL    NULL    9   Using where
1   PRIMARY     tbl_asxco   eq_ref  symbol_2,symbol     symbol_2    32  func    1   Using where
1   PRIMARY     tbl_asxd_extended   ALL     NULL    NULL    NULL    NULL    2195    Using where; Using join buffer
2   DEPENDENT SUBQUERY  tbl_asxd_extended   ALL     NULL    NULL    NULL    NULL    2195    Using where

2 个答案:

答案 0 :(得分:0)

  SELECT tbl_asxd_extended.close, tbl_asxd_extended.mcapintra, tbl_asxco.industry, tbl_asxco.company, tbl_watchlist.* 
FROM tbl_watchlist 
INNER JOIN tbl_asxco ON tbl_asxco.symbol = tbl_watchlist.symbol 
INNER JOIN tbl_asxd_extended ON tbl_asxd_extended.symbol = tbl_watchlist.symbol 
WHERE user_email='testuser@test.com' 
  AND tbl_asxd_extended.date = 
     (SELECT MAX(tbl_asxd_extended.date) FROM tbl_asxd_extended 
      WHERE tbl_watchlist.symbol = tbl_asxd_extended.symbol) 

这将解决您的问题,因为您使用的是max()而不是MAX();

如果可能的话,首先执行最后一个选择查询并将其存储在任何变量中,然后将结果变量分配给AND部分条件匹配

答案 1 :(得分:0)

不相关的子查询通常优于相关的子查询:

SELECT e.close
     , e.mcapintra
     , s.industry
     , s.company
     , w.* 
  FROM tbl_watchlist w
  JOIN tbl_asxco a
    ON a.symbol = w.symbol 
  JOIN tbl_asxd_extended e
    ON e.symbol = w.symbol
  JOIN 
     ( SELECT symbol
            , MAX(date) date
         FROM tbl_asxd_extended 
        GROUP 
           BY symbol
     ) x 
    ON x.symbol = e.symbol
   AND x.date = e.date
 WHERE user_email = 'testuser@test.com' 

通过为上述提供EXPLAIN以及所有相关表的CREATE TABLE语句,可以获得进一步的性能改进。