这是我的场景:我有两个不同的表: 表'subscriptions'包含与订阅用户站点相关的所有信息,以及'rating'表,其中包含订阅站点产品的分数。简化是这样的:
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运算符允许您一次选择多个不同的表,但列数相同。我的问题是,在一次调用中加入由公共字段(在我的情况下创建)排序的不同类型的特定数量元素的最有效方法是什么?可能吗?非常感谢,任何帮助表示赞赏, 赫苏斯。
答案 0 :(得分:2)
需要UNION。
您可以在此处学习如何使用它:
Join two tables, then Order By date, BUT combining both tables
我在发布的链接中没有解释,但也可以在UNION上设置LIMIT。结合ORDER BY,这就是您所需要的。 (信息Frits van Campen)
(SELECT cols FROM subscriptions)
UNION
(SELECT cols FROM ratings);
ORDER BY created LIMIT 10
答案 1 :(得分: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
答案 2 :(得分:1)