2012-07-09 156 views
0

这是我的场景:我有两个不同的表格: 表'订阅'包含与订阅用户网站相关的所有信息,以及'收视表',其中包含订阅网站产品的分数。简化是类似的东西:创建一个结合了MySQL中几个查询结果的结果集?

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

现在我需要MySQL来回报我最近的10个项目,无论是订阅或评级。到目前为止,该解决方案发现是使两个不同的调用:

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

有了两个结果(20元),我通过“创建”责令多维数组,并与(保存在$项目取得前10名):

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

我怀疑这个解决方案是没有效率的,因为我得到它在两个呼叫,并返回更elemnts比我更需要。我一直在读UNION操作符允许你一次选择几个不同的表,但列数相同。我的问题是,在一次调用中,通过共同字段(在我的情况下创建)中加入特定数量的不同类型元素的最有效方法是什么?是可能的吗?非常感谢,任何帮助表示赞赏, Jesús。

回答

2

UNION是必需的。

您可以在此了解如何使用它:

Join two tables, then Order By date, BUT combining both tables

这不是在我发布的链接解释,但可以把限制对一个UNION为好。结合ORDER BY这是你所需要的。 (CRED到弗里茨面包车坎彭)

(SELECT cols FROM subscriptions) 
UNION 
(SELECT cols FROM ratings); 
ORDER BY created LIMIT 10 
+1

这不是在链接解释maxhud公布,但可以把'LIMIT'上'UNION'为好。结合'ORDER BY'这是你需要的。 – Halcyon 2012-07-09 16:48:16

+0

使用UNION的查询仍然是一个调用... – Braiba 2012-07-09 16:51:09

+0

已编辑。 @FritsvanCampen希望这没关系我在那里写了。不希望操作员错过您的评论 – maxhud 2012-07-09 16:52:10

1

修改您的查询使用UNION的结果结合起来,一旦有结果已合并,您可以利用由限制方法和顺序的输出限制到所需数量的记录。

通过或LIMIT应用于为了将个人选择,将条款 围住,括号内的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 
+0

但我明白我只能使用UNION,如果我的查询具有相同的列数...是真的吗?在我的情况下,两个表都有不同的列。编辑:在你的例子中,我得到20个元素,每个表10个,不是吗? – 2012-07-09 16:52:34

+0

这是正确的,所以不是使用'*'来选择所有列,而只是选择适用的列来使输出匹配。 – RobB 2012-07-09 16:53:42

+2

这段代码是错误的,您应该将'ORDER BY created'LIMIT 10'移动到'UNION'的外部。此代码为您提供最近10次订阅和最近10次评分,其中OP要求最近10个'项目'(订阅或评分)。 – Halcyon 2012-07-09 16:54:09