【问题标题】:How to execute second query based on first query result如何根据第一个查询结果执行第二个查询
【发布时间】:2017-07-07 16:35:57
【问题描述】:

我有一种情况,我需要根据第一个 query 结果execute 第二个 query

这是我的第一个查询结果:

id  current_date    starts_on   ends_on Product_id  days_remaining
1   2017-06-21T12:00:00 2017-06-20T12:00:00Z    2017-06-23T12:00:00Z    3   2
2   2017-06-21T12:00:00 2017-06-01T12:00:00Z    2017-06-03T12:00:00Z    4   0
3   2017-06-21T12:00:00 2017-06-01T12:00:00Z    2017-06-03T12:00:00Z    7   0
4   2017-06-21T12:00:00 2017-07-01T12:00:00Z    2017-07-03T12:00:00Z    5   12

在这里您可以看到 remaining_days 有 2 个 zeros(0) 作为结果我想从 product 表中获取所有 product_name

我的上述结果的表和查询都已实现,但对于 获取 product_name 未实现。请帮帮我

这是我的 sqlfiddle: http://sqlfiddle.com/#!9/5bf34/1

我的问题:如果days_remaining(见上述结果)为0,我想得到所有product_name

简而言之,如果 days_remaining 为 0,则获取所有 product_name

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    使用您自己的查询,我对其进行了扩展:

    #assume this is the date as NOW()
    SET @mycurrentDate = '2017-06-21T12:00:00';
    SELECT * FROM product WHERE product_id IN (
      SELECT product_id FROM (
        SELECT 
          id, 
          @mycurrentDate AS `current_date`,
          `tn`.`start` AS `starts_on`,
          `tn`.`end` AS `ends_on`,
          `tn`.`product_id` AS `Product_id`,
          IF(`tn`.`end` >= @mycurrentDate,
             DATEDIFF(`tn`.`end`, @mycurrentDate), #show days until event ends
             0 #the event has already passed
          ) AS `days_remaining`
        FROM `booking` AS `tn`
      ) tmp1
      WHERE `days_remaining` = 0
    ) 
    

    【讨论】:

      【解决方案2】:

      你可以在这样的 WHERE 中做到这一点:

      SELECT 
          tn.id, 
          p.product_name,
          @mycurrentDate AS `current_date`,
          `tn`.`start` AS `starts_on`,
          `tn`.`end` AS `ends_on`,
          `tn`.`product_id` AS `Product_id`
      FROM `booking` AS `tn`
      JOIN product as `p` on p.product_id = tn.product_id
      WHERE IF(`tn`.`end` >= @mycurrentDate,
               DATEDIFF(`tn`.`end`, @mycurrentDate), #show days until event ends
               0 #the event has already passed
          ) = 0
      

      小提琴:http://sqlfiddle.com/#!9/5bf34/25

      编辑:不完全是第二个查询,而是您正在寻找的结果。

      【讨论】:

        【解决方案3】:

        您可以使用以下解决方案:

        SET @mycurrentDate = '2017-06-21T12:00:00';
        SELECT p.product_name, tn.* FROM (
            SELECT 
                id, 
                @mycurrentDate AS `current_date`,
                `tn`.`start` AS `starts_on`,
                `tn`.`end` AS `ends_on`,
                `tn`.`product_id` AS `Product_id`,
                IF(`tn`.`end` >= @mycurrentDate, DATEDIFF(`tn`.`end`, @mycurrentDate), 0) AS `days_remaining`
            FROM `booking` AS `tn`
        )tn LEFT JOIN product p ON tn.`Product_id` = p.product_id AND tn.`days_remaining` = 0
        -- WHERE tn.days_remaining = 0
        

        演示: http://sqlfiddle.com/#!9/5bf34/18/1

        解释:

        我将您的查询包装到FROMLEFT JOIN 中,结果表product 的标识为product_id。此外,LEFT JOIN 仅在 days_remaining 为零时才匹配。

        如果您想过滤结果以仅显示带有 product_name 的记录,您必须在此解决方案的末尾添加以下行:WHERE tn.days_remaining = 0

        【讨论】:

          猜你喜欢
          • 2015-03-16
          • 1970-01-01
          • 2014-12-02
          • 1970-01-01
          • 2013-11-01
          • 1970-01-01
          • 2021-02-27
          • 1970-01-01
          • 2020-03-09
          相关资源
          最近更新 更多