Mysql获得分组的第一个和最后一个记录

时间:2013-01-15 09:40:26

标签: mysql subquery grouping

我的查询存在问题,我无法弄清楚如何执行。

让我简化表结构;

|-------------|--------|
| node_id     |  id    |
| 2610        |  1643  |
| 2610        |  1644  |
| 2610        |  1645  |
| 2610        |  1646  |
| 2611        |  1647  |
| 2611        |  1648  |

等等

我需要通过node_id查询第一个和最后一个记录分组,按id排序 结果必须是:

| 2610  | 1643  | 1645  |
| 2611  | 1647  | 1648  |

3 个答案:

答案 0 :(得分:3)

SELECT  node_id, MIN(id), MAX(id)
FROM    mytable
GROUP BY
        node_id

答案 1 :(得分:2)

您可以使用以下查询:

<?php
    $data_provider = $model->viewEmployees($search, $from, $to);

    $data_provider->pagination = false;

$this->widget('ext.pdfGrid.EPDFGrid', array(
        'id' => 'employee-pdf',
        'fileName' => 'Employees',
        'dataProvider' => $model->viewEmployees($search, $from, $to),
        'columns' => array(                
            array('name' => 'ID Number','value' => '$data->company_id', 'htmlOptions'=>array('width'=>'10%'),),                
            array('name' => 'Name', 'header' => 'Name', 'value' => '$data->getNameWithMiddleInitial()', 'htmlOptions' => array('width'=>'10%')),                         
            array('name' => 'Date Employed', 'value' => '$data->date_employed' ,'htmlOptions'=>array('width'=>'10%')),                
        ),
        'config' => array(
            'title' => 'Sprasia Philippines Information Management System',
            'subTitle' => 'List of Employees',
            'headerDetails' => true,
            'showLogo' => true,
            'colAligns' => array('C', 'C', 'C'),
        ),
    ));
?>

它将返回两个记录。第一行具有最低id,第二行具有最高id。

答案 2 :(得分:1)

我已经实现了Quassnoi答案并且itr有效,但是如果我复杂一点查询结构我没有得到所需的结果

我会尝试解释: 想象一下,在表格中添加一些字段,其中每一行代表一个时间间隔

| ------------- | -------- | ------------ | ---------- | ---------- |
| node_id | id |一天| ifrom | ito |
| 2610 | 1643 | 2013-01-23 | 08:00:00 | 10:00:00 |
| 2610 | 1644 | 2013-01-23 | 10:00:00 | 12:30:00 |
| 2610 | 1645 | 2013-01-24 | 08:00:00 | 12:30:00 |
| 2610 | 1646 | 2013-01-24 | 13:30:00 | 15:00:00 |
| 2611 | 1647 | 2013-01-28 | 08:00:00 | 09:30:00 |
| 2611 | 1648 | 2013-01-29 | 11:00:00 | 12:00:00 |

我需要获得每组的最小开始和最大结束;类似于以下内容

| ------------- | --------------------- | ---------- ----------- |
| node_id |开始|结束|
| 2610 | 2013-01-23 08:00:00 | 2013-01-24 15:00:00 |
| 2611 | 2013-01-28 08:00:00 | 2013-01-29 09:30:00 |

有没有办法获得它?我尝试了这个查询,但最终失败了

SELECT node_id, MIN( UNIX_TIMESTAMP( CONCAT(
DAY , ' ', ifrom ) ) ) AS ifrom, MAX( UNIX_TIMESTAMP( CONCAT(
DAY , ' ', ito ) ) ) AS ito
FROM table
GROUP BY node_id
ORDER BY ifrom

它有效,但由于我需要直接在查询中获取日期+时间的文本表示,我试过了

SELECT node_id, MIN( UNIX_TIMESTAMP( CONCAT(
DAY , ' ', ifrom ) ) ) AS ifrom, MAX( UNIX_TIMESTAMP( CONCAT(
DAY , ' ', ito ) ) ) AS ito, FROM_UNIXTIME( MIN( UNIX_TIMESTAMP( CONCAT(
DAY , ' ', ifrom ) ) ) , '%d-%m-%Y %H:%i' ) AS itxtfrom, FROM_UNIXTIME( MIN(     UNIX_TIMESTAMP( CONCAT(
DAY , ' ', ito ) ) ) , '%d-%m-%Y %H:%i' ) AS itxtto
FROM table
GROUP BY node_id
ORDER BY ifrom



但在这种情况下,它无法获得间隔的结束

有人有想法吗? 问候