【问题标题】:How to SELECT date and time within that date?如何在该日期内选择日期和时间?
【发布时间】:2018-04-01 21:53:41
【问题描述】:

我阅读了几篇关于此的文章: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 列)中的特定值相关的最大日期的最大时间。因此,对于每个表中相同的每个 .gm 值,这是一行(在示例中我给它的是 table1.gm 和 table2.gm ...),而不仅仅是一行。解决方案 Nick 和 Salim 提供了解决方案,但我没有解决问题。

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

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

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

【问题讨论】:

  • 尝试使用MAX(DATE(table1.date))MAX(TIME(table2.date))。第一个将返回 MAX 日期,第二个 - MAX 时间。
  • 感谢回复,但又返回多行。
  • join the rest on some other value 是什么意思?在同一个查询中加入其他表?找到MAX日期和MAX时间的table1、table2与其他3张表有什么关系?
  • 其他 3 个表没有时间列。他们总是每天只有一次进入,并且一直在更新。我加入他们的日期和一些身份证号码。是的,我将它们加入到同一个查询中。如果需要,我将编辑带有完整查询的问题?
  • 您能否提供表中数据的示例?测试连接或比较结果会很有帮助。

标签: mysql


【解决方案1】:

您当前查询的问题是它将选择所有行,其中 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)

【讨论】:

  • 尼克谢谢你!我试图实施你的建议。它就像你说的那样工作。事情是我忘了说非常重要的事情。它应该为每个特定的列值返回一行。所有表格都与 samo 值相关。它是 gms_cfg_gm 和 *.gm_company_no 在所有其他。有39行。我应该得到他们每个人的最大时间和最大日期。所以结果应该包含 39 行。如果您有任何进一步的建议,我愿意倾听。
  • 嗨佩拉,看起来你自己解决了这个问题?
  • 在您的帮助下!我找不到 (SELECT MAX(time) FROM table1 AS t1 WHERE t1.date = table1.date) 解决方案。这就是您的回答被接受的原因。
  • 谢谢 - 我很高兴能够帮助您解决整个问题。
【解决方案2】:

我没有 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
;

【讨论】:

  • 谢谢萨利姆。我实施了尼克的解决方案。但是你的回答给了我使用 group by 的另一部分的想法。我还不能投票,但我会尽快给你+1!
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多