7

我有一张桌子,想用一个订单获得 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

4 回答 4

2

如有必要,将“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 条记录。

于 2012-06-27T17:28:03.057 回答
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

您可以为您的子选择设置一个更高的限制,并为您的外部选择添加一个额外的限制,虽然......

于 2012-05-14T14:20:12.960 回答
0
WITH combined
AS
(
    SELECT * from table1
    union 
    SELECT * from table2
)
SELECT TOP 30 * FROM combined ORDER BY date_uploaded

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

于 2012-07-26T04:07:11.210 回答
-1

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

试试这个!

SELECT top 15 * FROM table1 UNION SELECT top 15 * FROM table1 ORDER BY date_upload

于 2012-05-22T10:54:46.697 回答