【问题标题】:MySQL: using main query variable on sub-sub-queryMySQL:在子查询上使用主查询变量
【发布时间】:2018-07-14 20:05:40
【问题描述】:

我正在尝试创建查询,该查询将显示过去 2 周的股票表、股票名称、ID、日期、网址、价格和价格列表。

对于 14 天的历史,我在 select 上使用了带有 group_concat 的子查询。

但是当我使用 group_concat 时,它会返回所有结果并忽略我的限制,所以我创建了另一个子查询,它将是 14 个价格,而 group_concat 将使它成为一个列表。

表'record_log'是所有股票的记录:
parent_stock_id - 此行所属的实际库存
价格 - 价格
search_date - 价格日期

第二个表是“股票”:
id - 股票的 id
名称,market_volume....

问题出在这里:
在子子查询(SELECT 的最后一行)中,当我过滤 parent_stock_id=stocks.id 时,他无法识别stocks.id,因为它属于主查询。
如何我从顶部获取 stock_id 并将其传递给子子查询?或者也许是另一个想法?

SELECT
    stocks.id AS stock_id,
    record_log.price AS price,
    record_log.search_date,
    (SELECT GROUP_CONCAT(price) FROM (SELECT price FROM record_log WHERE parent_stock_id=stocks.id ORDER BY id DESC LIMIT 14) AS nevemind) AS history
FROM stocks
INNER JOIN record_log ON stocks.id = record_log.parent_stock_id
WHERE
    record_log.another_check !=0

谢谢!

---我并没有真正将它用于股票,它只是最简单的解释方式:)

【问题讨论】:

  • WHERE AND record_log.another_check !=0 正确吗?
  • @daniel.shih 这是另一行,我删除了“AND”。这不是问题:(

标签: mysql sql


【解决方案1】:

一种方法是使用substring_index() 并消除多余的子查询:

SELECT s.id AS stock_id, rl.price AS price, rl.search_date,
       (SELECT SUBSTRING_INDEX(GROUP_CONCAT(price ORDER BY id DESC), ',', 14)
        FROM record_log rl2
        WHERE rl2.parent_stock_id = s.id 
       ) AS history
FROM stocks s INNER JOIN
     record_log rl
     ON s.id = rl.parent_stock_id
WHERE rl.another_check <> 0;

请注意,MySQL 对 group_concat() 中间结果 (group_concat_max_len) 的长度有可设置的限制。此参数默认为 1,024。

【讨论】:

  • 谢谢! 'SUBSTRING_INDEX' 绝对是我所需要的 :)
猜你喜欢
  • 2020-05-06
  • 2011-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-26
  • 2013-05-15
相关资源
最近更新 更多