0

这是我的场景:我有两个不同的表:“订阅”表包含与用户网站订阅相关的所有信息,“评分”表包含订阅网站产品的分数。简化是这样的:

Subscriptions: 'id','user','place','created', etc.
Ratings: 'id','user','product','created',etc.

现在我需要 mysql 来返回我最近的 10 个项目,无论是订阅还是评分。到目前为止,找到的解决方案是进行两个不同的调用:

SELECT * FROM subscriptions WHERE ... ORDER BY created LIMIT 10. 

有了这两个结果(20 个元素),我通过“created”对多维数组进行排序,并获得前 10 个(将结果保存在 $items 中):

$items = array_slice($items, 0, 10);

我怀疑这个解决方案效率不高,因为我在两次调用中得到它,并返回比我需要的更多的元素。我一直在阅读 UNION 运算符允许您一次选择多个不同的表,但列数相同。我的问题是,在一次调用中加入由公共字段(在我的情况下创建)排序的特定数量的不同类型元素的最有效方法是什么?不可能吗?非常感谢,感谢任何帮助,Jesús。

4

3 回答 3

2

UNION 是必需的。

你可以在这里学习如何使用它:

加入两个表,然后按日期排序,但合并两个表

我发布的链接中没有解释,但也可以在 UNION 上设置一个限制。结合 ORDER BY 这就是您所需要的。(归功于 Frits van Campen)

(SELECT cols FROM subscriptions) 
UNION 
(SELECT cols FROM ratings);
ORDER BY created LIMIT 10
于 2012-07-09T16:47:54.200 回答
1

修改您的查询以使用UNION来组合结果,一旦组合了结果,您就可以利用 LIMIT 方法和 ORDER BY 将输出限制为所需的记录数。

要将 ORDER BY 或 LIMIT 应用于单个 SELECT,请将子句放在括 SELECT 的括号内:

此外:

要使用 ORDER BY 或 LIMIT 子句对整个 UNION 结果进行排序或限制,请将各个 SELECT 语句括起来并将 ORDER BY 或 LIMIT 放在最后一个之后。

(SELECT cols FROM subscriptions WHERE ... ORDER BY created LIMIT 10) 
UNION 
(SELECT cols FROM ratings WHERE ... ORDER BY created LIMIT 10);
ORDER BY created LIMIT 10
于 2012-07-09T16:48:41.760 回答
1

使用UNIONhttp ://dev.mysql.com/doc/refman/5.0/en/union.html

于 2012-07-09T16:48:48.273 回答