如何根据第一个查询结果执行第二个查询

Posted

技术标签:

【中文标题】如何根据第一个查询结果执行第二个查询【英文标题】: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

【问题讨论】:

【参考方案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

【讨论】:

以上是关于如何根据第一个查询结果执行第二个查询的主要内容,如果未能解决你的问题,请参考以下文章

Laravel中的MySQL子查询,如何加入查询并将第二个查询的结果作为新列添加到第一个查询?

在第二个查询中查询两个单独的表传递结果,同时仅在第二个查询返回 null 时保留第一个查询的结果

如何加入/子查询第二个表

从一个查询中添加一个结果,然后从另一个查询中添加第二个结果

mongoose 各种执行

PHP + Mysql:来自第一个查询的动态表名,用于执行第二个查询