如何在mysql中选择与其他随机结果匹配的结果

如何在mysql中选择与其他随机结果匹配的结果,mysql,sql,Mysql,Sql,我希望选择数据库表中的所有匹配结果,其中也包含随机结果,但匹配结果位于顶部。顺便说一下,我现在使用两个查询,第一个是匹配查询,如果计数为零,我现在选择随机结果。我只想用一个查询就可以做到这一点。您可以尝试使用UNION ALL查询,如下所示 select product_name,price from marketing_table where price >=5000 /*user supplied filter*/ and price <=10000 /*user s

我希望选择数据库表中的所有匹配结果,其中也包含随机结果,但匹配结果位于顶部。顺便说一下,我现在使用两个查询,第一个是匹配查询,如果计数为零,我现在选择随机结果。我只想用一个查询就可以做到这一点。

您可以尝试使用UNION ALL查询,如下所示

select product_name,price
  from marketing_table
 where price >=5000 /*user supplied filter*/
   and price <=10000 /*user supplied filter*/
union all
select m.product_name,m.price
  from marketing_table m
 where not exists (select *
                     from marketing_table m1
                    where m1.price >=5000 /*user supplied filter*/
                      and m1.price <=10000 /*user supplied filter*/
                   )

我从您的评论中了解到,您可以先尝试以下简单方式:

SET @product := 'purse'; -- search term

SELECT * FROM product 
ORDER BY product_name LIKE CONCAT('%',@product,'%') DESC, price ASC;
这是我能想到的最简单的方法,它可以作为你的起点

下面是一个演示:


如果这不是您想要的,您必须输入并插入一些具有预期输出的示例数据。您当前的问题往往被标记为过于宽泛,需要重点/清晰。

您是否尝试使用带限制的联合子查询

SELECT *
FROM (
SELECT 0 priority, t.*
FROM first_table t
UNION ALL
SELECT 1 priority, t.*
FROM second_table t
)
ORDER BY priority
LIMIT 20
如果不希望在第一个\u表返回时包含任何第二个\u表记录,则需要对第二个查询执行子查询以确认不存在任何行

SELECT *
FROM (
SELECT 0 priority, t.*
FROM first_table t
UNION ALL
SELECT 1 priority, t.*
FROM second_table t
LEFT JOIN (SELECT ... FROM first_table) a
WHERE a.id IS NULL
)
ORDER BY priority
LIMIT 20
我认为,如果您使用的是MySQL 8中的Common Table Expressions CTE功能,那么就有可能使用该版本


你能举个例子吗?或者可以显示您的模式?我正在使用“最小”和“最大价格”等过滤器进行搜索,因此,如果没有与筛选器匹配的记录,我不希望搜索返回空结果,而是返回随机结果;如果没有几条记录与搜索筛选器匹配,则返回少数记录,其中随机记录位于顶部,但匹配记录位于顶部。您只需与您的将条件第二个查询与随机查询进行匹配。这样,您不需要编写两个查询,而是将其合并为一个查询。您不需要全部联合,只需在where子句中使用OR即可。也就是说,MySQL中的optimize在您的版本中可能会做得更好,因为我希望两个表同时返回结果,否则将不是理想的解决方案。