如何根据第一个查询结果执行第二个查询
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
解释:
我将您的查询包装到FROM
和LEFT JOIN
中,结果表product
的标识为product_id
。此外,LEFT JOIN
仅在 days_remaining
为零时才匹配。
如果您想过滤结果以仅显示带有 product_name
的记录,您必须在此解决方案的末尾添加以下行:WHERE tn.days_remaining = 0
。
【讨论】:
以上是关于如何根据第一个查询结果执行第二个查询的主要内容,如果未能解决你的问题,请参考以下文章
Laravel中的MySQL子查询,如何加入查询并将第二个查询的结果作为新列添加到第一个查询?