限制 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的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL JOIN,如何将一张表的结果限制为最近的记录

在没有 FROM 子查询的 JOIN 中写入具有总和限制的 SQL 计数

根据 JOIN ON 参数或 WHERE 参数限制 SQL 结果

如何将 LEFT JOIN 限制为 SQL Server 中的第一个结果?

sql中的inner join ,left join ,right join

关于在left join的on子句中限制左边表的取值时出现非期望的结果