Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL-选择查询-最早和最年轻的日期_Mysql_Sql - Fatal编程技术网

MySQL-选择查询-最早和最年轻的日期

MySQL-选择查询-最早和最年轻的日期,mysql,sql,Mysql,Sql,我必须构建一个SQL SELECT查询。表结构如下: [ID] [PHONE] [description] [DATE] [1] [600898367] [main] [2016-01-23] [2] [600898367] [] [2016-01-24] [3] [600898367] [] [2016-01-26] [4] [600898367] [] [2016-01-28] [5] [662349093] [main] [2016-01-10] [6] [662349093] [] [2

我必须构建一个SQL SELECT查询。表结构如下:

[ID] [PHONE] [description] [DATE]
[1] [600898367] [main] [2016-01-23]
[2] [600898367] [] [2016-01-24]
[3] [600898367] [] [2016-01-26]
[4] [600898367] [] [2016-01-28]
[5] [662349093] [main] [2016-01-10]
[6] [662349093] [] [2016-01-21]
[7] [662349093] [] [2016-01-30]
[8] [662349093] [] [2016-01-31] 
您在同一电话号码中有不同的记录。第一个(最早的)事件用[main]标志标记。没有两个与[main]标志相同的数字。 我想选择每个[main]记录,另外选择一个电话号码相同的最年轻记录,因此结果应该是记录1,4,5,8


请提供帮助。

使用
WHERE
子句提供带有
main
标志的记录。使用
MAX
获取最新记录,使用
JOIN
获取附加列。最后,执行一个
UNION ALL
组合结果

-- Get the main records first
SELECT *
FROM tbl
WHERE description = 'main'

UNION ALL

-- Get the most recent records
SELECT b.*
FROM (
    SELECT
        t.PHONE,
        MAX(DATE) AS MaxDate
    FROM tbl t
    GROUP BY PHONE
) a
INNER JOIN tbl b -- Do a JOIN to get the additional columns
    ON b.PHONE = a.PHONE
    AND b.DATE = a.MaxDate

您可以使用以下查询:

SELECT t1.*, t3.*
FROM mytable AS t1
LEFT JOIN (
   SELECT PHONE, MAX(date) AS max_date
   FROM mytable 
   GROUP BY PHONE
) AS t2 ON t1.PHONE = t2.PHONE
LEFT JOIN mytable AS t3 ON t1.PHONE = t3.PHONE AND t2.max_date = t3.`date`
WHERE t1.description = 'main'
试试这个;)

MySQL 5.6架构

CREATE TABLE table1
    (`ID` int, `PHONE` int, `description` varchar(4), `DATE` varchar(11))
;

INSERT INTO table1
    (`ID`, `PHONE`, `description`, `DATE`)
VALUES
    (1, 600898367, 'main', '2016-01-23'),
    (2, 600898367, NULL, '2016-01-24'),
    (3, 600898367, NULL, '2016-01-26'),
    (4, 600898367, NULL, '2016-01-28'),
    (5, 662349093, 'main', '2016-01-10'),
    (6, 662349093, NULL, '2016-01-21'),
    (7, 662349093, NULL, '2016-01-30'),
    (8, 662349093, NULL, '2016-01-31')
;
select t.*
from table1 t
inner join (
    select `PHONE`, max(`DATE`) as `DATE` from table1 group by `PHONE`
) t1 on t.`PHONE` = t1.`PHONE` and (t.`DATE` = t1.`DATE` or t.`description` = 'main')
order by t.`ID`
| ID |     PHONE | description |       DATE |
|----|-----------|-------------|------------|
|  1 | 600898367 |        main | 2016-01-23 |
|  4 | 600898367 |      (null) | 2016-01-28 |
|  5 | 662349093 |        main | 2016-01-10 |
|  8 | 662349093 |      (null) | 2016-01-31 |
查询1

CREATE TABLE table1
    (`ID` int, `PHONE` int, `description` varchar(4), `DATE` varchar(11))
;

INSERT INTO table1
    (`ID`, `PHONE`, `description`, `DATE`)
VALUES
    (1, 600898367, 'main', '2016-01-23'),
    (2, 600898367, NULL, '2016-01-24'),
    (3, 600898367, NULL, '2016-01-26'),
    (4, 600898367, NULL, '2016-01-28'),
    (5, 662349093, 'main', '2016-01-10'),
    (6, 662349093, NULL, '2016-01-21'),
    (7, 662349093, NULL, '2016-01-30'),
    (8, 662349093, NULL, '2016-01-31')
;
select t.*
from table1 t
inner join (
    select `PHONE`, max(`DATE`) as `DATE` from table1 group by `PHONE`
) t1 on t.`PHONE` = t1.`PHONE` and (t.`DATE` = t1.`DATE` or t.`description` = 'main')
order by t.`ID`
| ID |     PHONE | description |       DATE |
|----|-----------|-------------|------------|
|  1 | 600898367 |        main | 2016-01-23 |
|  4 | 600898367 |      (null) | 2016-01-28 |
|  5 | 662349093 |        main | 2016-01-10 |
|  8 | 662349093 |      (null) | 2016-01-31 |

CREATE TABLE table1
    (`ID` int, `PHONE` int, `description` varchar(4), `DATE` varchar(11))
;

INSERT INTO table1
    (`ID`, `PHONE`, `description`, `DATE`)
VALUES
    (1, 600898367, 'main', '2016-01-23'),
    (2, 600898367, NULL, '2016-01-24'),
    (3, 600898367, NULL, '2016-01-26'),
    (4, 600898367, NULL, '2016-01-28'),
    (5, 662349093, 'main', '2016-01-10'),
    (6, 662349093, NULL, '2016-01-21'),
    (7, 662349093, NULL, '2016-01-30'),
    (8, 662349093, NULL, '2016-01-31')
;
select t.*
from table1 t
inner join (
    select `PHONE`, max(`DATE`) as `DATE` from table1 group by `PHONE`
) t1 on t.`PHONE` = t1.`PHONE` and (t.`DATE` = t1.`DATE` or t.`description` = 'main')
order by t.`ID`
| ID |     PHONE | description |       DATE |
|----|-----------|-------------|------------|
|  1 | 600898367 |        main | 2016-01-23 |
|  4 | 600898367 |      (null) | 2016-01-28 |
|  5 | 662349093 |        main | 2016-01-10 |
|  8 | 662349093 |      (null) | 2016-01-31 |

使用
分组依据
我们将首先在
电话
描述
上分组,从而得到4行

接下来,我们将使用创建一个逗号分隔集。可以使用
orderby
子句按日期订购电话号码

最后,我们要从集合中获取第一项,我们可以使用



请尝试以下查询

SELECT 
  A.* 
FROM
  `old_young` A 
  INNER JOIN 
    (SELECT 
      MIN(`DATE`) AS Res 
    FROM
      old_young 
    WHERE description = 'main' 
    GROUP BY PHONE 
    UNION
    ALL 
    SELECT 
      MAX(`DATE`) AS Res 
    FROM
      old_young 
    WHERE description = '' 
    GROUP BY PHONE) B 
    ON A.DATE = B.Res ;  

检查

您也可以使用UNION解决部分问题我的表中有大约100k条记录。也许两个单独的查询比JOIN更快?我认为op需要一个4列的结果,因为它是
MAX(DATE)
:D@Reno接得好!我还需要一杯咖啡。注意:这个答案假设输出不需要
ID
DATE
字段。