2016-12-01 72 views
1

我有一个查询获取表的记录,并统计该表的相关记录数。MySQL子查询 - 获取最新的时间戳记录和提取字段

我想要做的就是最近的一个相关表记录的text领域,包括它在查询

SELECT DISTINCT 
    inst.id, inst.name, inst.state, inst.farm_status, 
    (SELECT COUNT(inst_note.id) 
     FROM project_institution_note AS inst_note 
     WHERE inst_note.institution_id = inst.id) AS inst_note_count, 
    (SELECT COUNT(c.id) FROM project_catalog AS c 
     WHERE c.institution_id = inst.id 
     AND c.status = 0 
     AND c.catalog_type BETWEEN 0 AND 1) AS ug_count, 
    (SELECT COUNT(c.id) FROM project_catalog AS c 
     WHERE c.institution_id = inst.id 
     AND c.status = 0 
     AND c.catalog_type BETWEEN 1 AND 2) AS grad_count, 
    (SELECT COUNT(c.id) FROM project_catalog AS c 
     WHERE c.institution_id = inst.id 
     AND c.status = 0 
     AND c.catalog_type >= 3) AS alt_count, 
    (SELECT COUNT(c.id) FROM project_catalog_note AS cn 
     INNER JOIN farmtool_catalog AS c 
     ON c.id = cn.catalog_id 
     WHERE c.institution_id = inst.id) AS catalog_note_count, 
    (SELECT inst_note.text FROM project_institution_note AS inst_note -- Issue portion of query 
     LEFT JOIN project_institution AS inst 
     ON inst_note.institution_id = inst.id 
     WHERE inst_note.institution_id = inst.id 
     ORDER BY inst_note.date DESC 
     LIMIT 1) AS latest_note 
FROM project_institution AS inst 
LEFT JOIN project_institution_note AS inst_note 
ON inst.id = inst_note.institution_id 
LEFT JOIN project_catalog AS c 
ON inst.id = c.institution_id 
WHERE LOWER(inst.state) = "me"; 

这到底是怎么发生的是它拿起最后一个记录project_institution_note并提供text作为查询中的值。有了这个子查询,我怎么能

  1. 限制project_institution_note到相关project_institution.id
  2. 选择选择最新的时间戳记录。

我已经完成了#2,但是我需要帮助限制#1中的结果集。有任何想法吗?

+0

向我们显示样本数据和预期输出。 \t [**如何创建一个最小,完整和可验证的示例**](http://stackoverflow.com/help/mcve)事情是你告诉我们太多的数据与你的问题无关。所以尽量减少代码来隔离问题。 –

回答

2

最新记录是什么?也就是project_institution_note的记录与最近的date值?

如果project_institution_note有一个自动增量的id列,并且您只有INSERT并且永远不更新该表,这很容易。这是一个子查询,它获取每个institution_id的最新text值。

    SELECT a.institution_id, a.text 
        FROM project_institution_note a 
        JOIN ( SELECT MAX(id) id 
           FROM project_institution_note 
           GROUP BY institution_id 
         ) b ON a.id = b.id 

,基本上使用最大id值的每一个机构来查找最新text名单。

如果您必须使用date列,它会稍微困难一些,但遵循相同的模式。 (如果两个date值是相同的,你从中得到两个结果。)

    SELECT a.institution_id, a.text 
        FROM project_institution_note a 
        JOIN ( SELECT institution_id, 
            MAX(date) date 
           FROM project_institution_note 
           GROUP BY institution_id 
         ) b ON a.date = b.date 
          AND a.institution_id = b.institution_id      

然后,您可以使用它作为一个独立的(不相关的)子查询,并将其加入到你的其他的东西。下面是使用LEFT JOIN代替JOIN防止在没有票据存在抑制结果的查询为例

SELECT inst.id, inst.name, inst.state, inst.farm_status, 
     note.text 
    FROM project_institution inst 
    LEFT JOIN (
       /* the subquery from above */ 
     ) note ON inst.id = note.institution_id 

在查询中有很多依赖子查询。在依赖子查询中,MySQL是可怕的。您可能希望将它们重构为独立的子查询,然后加入它们。

0

我最终找到了解决方案。

作为SELECT的字段声明的一部分,我定义了inst.id,它来自project_institution。在SELECT子查询的内部,我还说我想从'project_institution',它重新声明别名inst.id

更改inst子查询

SELECT inst_note.text FROM project_institution_note AS inst_note 
    LEFT JOIN project_institution AS `inst` 
    ON inst_note.institution_id = `inst.id` 
    WHERE inst_note.institution_id = `inst.id` 

institution里面,institution.id,分别,并获得成功。