如果没有结果,MySQL回退查询

时间:2016-05-19 15:35:54

标签: php mysql pdo

我有这个查询,从videos表中选择10个相关视频到给定视频。我想要always to have 10 results所以如果这个查询无法获得结果或者少于10个结果,那么另一个查询将会执行更少的条件。我之前计算php中的行,进行另一次查询并合并结果。它太慢了,代码太长了。我知道在SQL中做得更好更快。我正在PDO使用php

我如何组合它们?

第一个查询(主要一个):

select * from videos
where FROM_UNIXTIME(published) BETWEEN
DATE_SUB(FROM_UNIXTIME(:published), INTERVAL 6 MONTH)
AND DATE_ADD(FROM_UNIXTIME(:published), INTERVAL 6 MONTH)
and video_name != :video_name
ORDER BY RAND() limit 10";

第二次查询(后备):

select * from videos ORDER BY RAND() limit 10

2 个答案:

答案 0 :(得分:3)

您可以将它们与{ key: 'accountNumber', type: 'input', templateOptions: { label: 'Account #', disabled: true, required: true } } 结合使用,然后执行" parent" UNION再次SELECT

LIMIT

这将在最后为您提供10条记录,而无需任何PHP逻辑。不确定这种SQL会有什么性能。

答案 1 :(得分:1)

只需先对SELECTSELECT * FROM videos WHERE FROM_UNIXTIME(published) BETWEEN DATE_SUB(FROM_UNIXTIME(:published), INTERVAL 6 MONTH) AND DATE_ADD(FROM_UNIXTIME(:published), INTERVAL 6 MONTH) AND video_name != :video_name ORDER BY RAND() LIMIT 10 UNION SELECT * FROM videos ORDER BY RAND() LIMIT 10 个查询进行更具体的查询。然后保证有10到20行(只要表中至少有10行),你可以从结果中获取前10行。它将是10个特定的,10个默认的或与首先列出的特定组合:

SELECT

您还可以从子SELECT查询SELECT * FROM (SELECT * FROM videos WHERE FROM_UNIXTIME(published) BETWEEN DATE_SUB(FROM_UNIXTIME(:published), INTERVAL 6 MONTH) AND DATE_ADD(FROM_UNIXTIME(:published), INTERVAL 6 MONTH) AND video_name != :video_name ORDER BY RAND() LIMIT 10 UNION SELECT * FROM videos ORDER BY RAND() LIMIT 10) temporary LIMIT 10 中选择10个特定的查询,10个默认查询,然后选择其中的前10个:

[ref child:@"users/info"]

我不知道这些会有多快,但它们都在SQL中。