选择UNION但限制每个子查询并接收不同的值

时间:2012-05-14 14:06:29

标签: mysql sql

我有一张桌子,想要一个订单获得15个值,另一个订单获得15个值。目标是获得30个不同的价值 这是我的代码:

 (SELECT * FROM table1 WHERE criteria ORDER BY views DESC LIMIT 15)  
  UNION All  
 (SELECT * FROM table1 WHERE criteria ORDER BY date_upload DESC LIMIT 15) 

我知道如何使用两个查询(使用NOT IN)完成任务,但有没有办法在一个查询中完成它?

4 个答案:

答案 0 :(得分:1)

如有必要,请将“id”替换为主键名称:

(SELECT * FROM table1 WHERE criteria ORDER BY views DESC LIMIT 15)
UNION
(SELECT * FROM table1 WHERE criteria AND id NOT IN(SELECT id FROM table1 WHERE criteria LIMIT 15) ORDER BY date_upload DESC LIMIT 15)

此查询:
- 选择符合视图排序标准的前15条记录 - 选择前15个匹配条件而不是第一个SELECT,并按date_upload

对它们进行排序

使用此查询,每次在table1中有30个不同的记录时,您将确保获得30条记录。

答案 1 :(得分:0)

我不太确定,如果它是您正在寻找的,但您可以始终将其包装在子选择中并在外部SELECT中使用DISTINCT来过滤结果。当然,我们无法保证您将获得30个搜索结果:

SELECT DISTINCT * FROM (
    (SELECT * FROM table1 WHERE criteria ORDER BY views DESC LIMIT 15)  
     UNION All  
    (SELECT * FROM table1 WHERE criteria ORDER BY date_upload DESC LIMIT 15) 
) AS a

您可以为子选择设置更高的限制,并为外部选择添加额外限制,但是......

答案 2 :(得分:0)

UNION ALL将列出重复的记录,而不是弄乱Distinct和UNION ALL。尝试使用“UNION”,它可以为您提供独特的价值。

试试这个!

SELECT top 15 * FROM table1 联盟 SELECT top 15 * FROM table1 ORDER BY date_upload

答案 3 :(得分:0)

WITH combined
AS
(
    SELECT * from table1
    union 
    SELECT * from table2
)
SELECT TOP 30 * FROM combined ORDER BY date_uploaded

注意:将*与UNION一起使用并不是一个好主意。 最好列出字段。