如何在该日期内选择日期和时间?

时间:2018-04-01 21:53:41

标签: mysql

我读了几篇关于此的文章:Select max date, then max time这个似乎最有帮助,但我没有办法实现它。

有五张桌子。我加入他们。我需要从第一个表中选择一行具有最高日期和最高时间,从第二个表中选择相同的行,并将其余值与其他值相加。使用我编写的代码,我得到了多行。似乎时间选择不对。

可以在子查询中使用子查询来完成。我尝试过这样的事情:

    SELECT * from table1 
    INNER JOIN table2 ON table1.date = table2.date AND table1.gm = table2.gm        
    INNER JOIN table3 ON table2.gm = table3.gm        ...
    WHERE table3.date = :date AND table4.date = :date ...
    AND table1.date IN(
        SELECT MAX(table1.date) FROM table1 WHERE table1.time IN(
            SELECT MAX(table1.time) FROM table1
    )
    )
    AND table2.date IN(
        SELECT MAX(table2.date) FROM table1 WHERE table2.time IN(
            SELECT MAX(table2.time) FROM table2        )
    )
    ORDER BY table1.id

问题是: 如何在加入日期最高且时间最长的所有这一天后获得单行? 谢谢!

编辑:我很抱歉。我忘了说我需要与表格(gm列)中的特定值相关的最大日期最长时间。所以这是一行(在我给它的例子中是table1.gm和table2.gm ......)每个.gm值中的每一个都是相同的,而不是只有一行。解决方案尼克和萨利姆提供了作品,但我没有解决问题。

编辑:解决了!在实施Nick的解决方案后,我刚刚添加了GROUP BY cntrs_reper.gm_company_no,cntrs_reper.date。 就是这样。对于一个表中的每一行,其他人都有最高的日期和时间!谢谢大家。

EDIT。如果这可以帮助这是完整的查询:

SELECT  cntrs_gm.gm_company_no                          AS      company_c_g,  
 bns_gms.ded_bns                                    AS      ded_bns_gms,  
     bns_gms.no_ded_bns                             AS      no_ded_bns_gms,  
     bns_gms.wag_ded_bns                            AS      wag_ded_bns_gms,  
     cntrs_gm.cur_credit                            AS      cur_credit_c_g,  
     cntrs_gm.cdrop                                 AS      cdrop_c_g,  
     cntrs_gm.total_jp                              AS      total_jp_c_g,  
     cntrs_gm.games                                 AS      games_c_g,  
     cntrs_gm.wgames                                AS      wgames_c_g,  
     cntrs_gm.doors                                 AS      doors_c_g,  
     cntrs_gm.power                                 AS      power_c_g,  
     cntrs_gm.total_in                            AS        total_in_c_g,  
     cntrs_gm.total_out                           AS        total_out_c_g,  
     cntrs_gm.total_acc                           AS        total_acc_c_g,  
     cntrs_gm.total_bet                           AS        total_bet_c_g,  
     cntrs_gm.total_win                           AS        total_win_c_g,  
     cntrs_gm.total_bonus                         AS        total_bonus_c_g,  
     cntrs_gm.date              AS      date_c_g,  
     cntrs_reper.gm_company_no                    AS        company_reper,  
 bns_reper.ded_bns                            AS        ded_bns_reper,  
     bns_reper.no_ded_bns                         AS        no_ded_bns_reper,  
     bns_reper.wag_ded_bns          AS      wag_ded_bns_reper,  
     cntrs_reper.cur_credit         AS      cur_credit_reper,  
     cntrs_reper.cdrop              AS      cdrop_reper,  
     cntrs_reper.total_jp                         AS        total_jp_reper,  
     cntrs_reper.games              AS      games_reper,  
     cntrs_reper.wgames             AS      wgames_reper,  
     cntrs_reper.doors              AS      doors_reper,  
     cntrs_reper.power              AS      power_reper,  
     cntrs_reper.total_in                         AS        total_in_reper,  
     cntrs_reper.total_out          AS      total_out_reper,  
     cntrs_reper.total_acc          AS      total_acc_reper,  
     cntrs_reper.total_bet          AS      total_bet_reper,  
     cntrs_reper.total_win          AS      total_win_reper,  
     cntrs_reper.total_bonus            AS      total_bonus_reper,  
     cntrs_reper.date                             AS        date_reper,  
     cntrs_reper.time               AS      time_reper,
     bns_reper.time                 AS      time_c_g,
     gms_cfg.gm_no                                    AS              machine_id,  
     gms_cfg.denom_cin                        AS              machine_cin  
     FROM bns_gms  
     INNER JOIN cntrs_gm  
     ON bns_gms.gm_company_no = cntrs_gm.gm_company_no  AND bns_gms.date = cntrs_gm.date
     INNER JOIN bns_reper 
     ON cntrs_gm.gm_company_no = bns_reper.gm_company_no  
     INNER JOIN cntrs_reper  
     ON bns_reper.gm_company_no = cntrs_reper.gm_company_no  AND bns_reper.date = cntrs_reper.date
     INNER JOIN gms_cfg  
     ON cntrs_reper.gm_company_no =  gms_cfg.gm_no  
     WHERE   bns_reper.date IN(
        SELECT MAX(DATE(bns_reper.date)) FROM bns_reper WHERE bns_reper.time IN(
            SELECT MAX(TIME(bns_reper.time)) FROM bns_reper
        )
        )
     AND cntrs_reper.date IN(
        SELECT MAX(DATE(cntrs_reper.date)) FROM cntrs_reper  WHERE cntrs_reper.time IN(
            SELECT MAX(TIME(cntrs_reper.time)) FROM cntrs_reper
        )
        )

     ORDER BY cntrs_gm.gm_company_no

数据库示例

bns_gms

bns_reper

cntrs_gm

cntrs_reper

gms_cfg

2 个答案:

答案 0 :(得分:0)

我没有MySQL,但这是您可以使用的一般想法。我没有足够的积分来写评论,所以我作为答复回应。基本上为每个表创建子查询/内联视图以选择列的最大值,然后将这些子查询/内联视图连接在一起。

这是Oracle语法。您可以将其转换为ANSI语法。

select table1.column1, table2.column2,table3.column3 
from
(select id1, max(column1) as column1 from table1 group by id1) as table1
(select id2, max(column2) as column2 from table2  group by id2) as table2
(select id3, max(column3) as column3 from table3  group by id3) as table3
where 
table1.id1 = table2.id2
and table1.id1 = table3.id3
;

答案 1 :(得分:0)

您当前查询的问题是它将选择table1.date是最高时间发生的最新日期的所有行,这可能不止一个,例如对于诸如

之类的数据
id  date          time
1   2018-03-30    18:40
2   2018-03-31    12:20
3   2018-03-31    19:20

您的WHERE条款:

table1.date IN(
    SELECT MAX(table1.date) FROM table1 WHERE table1.time IN(
        SELECT MAX(table1.time) FROM table1
)

会选择id=2id=3的行,因为它们都有date = '2018-03-31',这是最长时间发生的时间。

您要做的是选择最新日期有最新时间的行,您可以使用

table1.date = (SELECT MAX(date) FROM table1) AND
table1.time = (SELECT MAX(time) FROM table1 WHERE date = (SELECT(MAX(date) FROM table1))

通过使用别名,可以简化(因为我们已经知道table1.date = MAX(date) FROM table1)到

table1.date = (SELECT MAX(date) FROM table1) AND
table1.time = (SELECT MAX(time) FROM table1 AS t1 WHERE t1.date = table1.date)