MySQL:在子查询

时间:2018-02-05 00:59:18

标签: mysql sql

我正在尝试创建查询,该查询将显示我最近2周内的股票表,股票名称,ID,日期,网址,价格和价格清单。

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

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

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

第二个表是'股票':
id - 股票的身份
name,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

谢谢!

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

1 个答案:

答案 0 :(得分:0)

一种方法是使用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。