限制 SQL JOIN
Posted
技术标签:
【中文标题】限制 SQL JOIN【英文标题】:LIMITing an SQL JOIN 【发布时间】:2010-10-04 10:39:35 【问题描述】:我正在尝试限制以下 SQL 语句。
SELECT expense.*, transaction.* FROM expense
INNER JOIN transaction ON expense_id = transaction_expense_id
我想做的是限制“父”行的数量。 IE。如果我执行 LIMIT 1,我将只收到一项费用项目,但仍会获得与之相关的所有交易。
这将如何实现?
在这个阶段,如果我执行 LIMIT 1,我会得到一笔费用,并且只有一笔交易。
【问题讨论】:
我可能很笨,但您不需要在连接中包含用户表吗? 正如@rixth 指出的那样,您需要限定您对 SELECT 中涉及的所有表的联接... 糟糕,忘记了用户表在里面!我的错字,任务已修复。 mysql 5.0 (needtogetto10characters) 【参考方案1】:所以假设我们可以排除用户表,它可以重写为:
select * from expense, transaction where expense_id = transaction_expense_id
现在如果你想应用一个限制,你可以这样做:
select * from expense, transaction where expense_id = transaction_expense_id and
expense_id in (select expense_id from expense limit 1)
这会做你想要的吗?显然,您需要谨慎对待您的费用 ID 将返回的顺序,因此您可能希望使用 ORDER BY。
编辑:鉴于您在下面的评论中描述的 MySQL 限制,也许这会起作用:
select * from (select id from expense order by WHATEVER limit 1) as t1, transaction where expense_id=transaction_expense_id;
本
【讨论】:
"#1235 - 这个版本的 MySQL 还不支持 'LIMIT & IN/ALL/ANY/SOME subquery'" 服务器版本:5.0.27-community-nt 子查询是做到这一点的正确方法。你已经达到了 MySQL 的限制;要么升级(升级到 5.1,这可能会解决这个问题,要么升级到 Postgres)。否则你将不得不考虑一个非纯 SQL 解决方案或一些非常可怕的东西。 标记为接受的答案,因为它可以在另一个 SQL 环境中工作。 @rixth:谢谢。我还添加了另一种可能对您有用的解决方案... :-) 这是个好消息!顺便说一句:这可能完全没有帮助,但我想知道您是否可能要考虑重命名表中的列?如果您将费用 ID 重命名为 id 那么您可以将其称为费用.id 或只是 id (当它明确时)。它可能有助于使事情变得更容易......【参考方案2】:您必须指定要获得的费用项目。最昂贵的?最新的?然后加入一个只返回的子查询:
SELECT
expense.*, transaction.*, user.*
FROM
(SELECT * FROM expense WHERE ...) AS expense
INNER JOIN
transaction ON expense_id = transaction_expense_id
【讨论】:
如果我想说,退回 10 个费用项目(带有关联交易) @rixth:这将使用与子查询返回的一样多的费用项目。 @Tom 将其更改为WHERE ... LIMIT 10) AS expense
。我想。【参考方案3】:
由于升级 SQL 服务器不是一种选择,我最终可能会执行两个查询。
expenses = SELECT * FROM expense ... LIMIT x
foreach expenses as expense
expense.transactions = SELECT * FROM transacion WHERE transaction_expense_id = expense.expense_id
【讨论】:
【参考方案4】:即使这是旧的......在搜索中遇到这个并认为我会添加一些想法,因为无法在子查询中使用限制......
select e.expense_id, transaction.*
from (select max(expense_id) from expense) e
inner join transaction t ON e.expense_id = t.transaction_expense_id
或者如果你想拥有来自expense
而不仅仅是expense_id
的所有列,你可以嵌套子查询。
select e.*, t.*
from (
select e1.*
from expense e1 inner join (select max(expense_id) from expense) e2
on e1.expense_id = e2.expense_id
) e inner join transaction t on e.expense_id = t.transaction_expense_id
【讨论】:
以上是关于限制 SQL JOIN的主要内容,如果未能解决你的问题,请参考以下文章
在没有 FROM 子查询的 JOIN 中写入具有总和限制的 SQL 计数
根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果
如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?