2013-07-16 32 views
1

我想在子查询中使用limit子句。同时,父查询列应该可以在子查询中访问。我正在使用MySQL并想做类似如下:在子查询中使用limit-clause和parent-query-column

select * from users u1 join (SELECT b1.userid from bids b1 where b1.userid=u1.userid limit 0,4) a1 

当然,这是无效的,因为b1.authorid不能以这种方式访问​​。

1)我想申请where子句如此明确以下内容排除后限制结果:

select * from users u1 JOIN (SELECT b1.userid from bids b1 limit 0,4) a1 ON b1.userid=u1.userid 

2)以下是不能在MySQL中(限制与支持IN/ANY/EVERY/SOME):

select * from users u1 join bids b2 ON b2.userid IN (SELECT b1.userid from bids b1 where b1.userid=u1.userid limit 0,4) 

有没有一种方法可以在MySQL中实现所需的结果?

SQLFiddle链接: SQL query

让我把查询的含义在不同的方式。 假设ANS输出,用户是用户表,BID是查询的竞价table.Representation会是这样的:

USER=table(users); 
While(USER has next raw) { 
    uraw=USER.nextraw; 
    BID=table(bids); 
    count=0; 
    While(BID has next raw) { 
    braw=BID.nextraw; 
    if(uraw.author < braw.id) { 
     if(count>=0) { 
     ANS.add(fields from uraw,fields from braw); 
     } 
     count=count+1; 
    } 
    if(count>=4) { 
     break; 
    } 
    } 
} 
return ANS; 
+1

如果你还在挣扎,考虑提供一个sqlfiddle与所需的结果。 – Strawberry

+0

我已经按照建议添加了sqlfiddle。 – user2587716

+0

好。好的,第一件事......没有ORDER BY的限制是毫无意义的。你究竟在努力实现什么,并且 - 请重新阅读我以前的评论! – Strawberry

回答

0

是的,它支持限制连接查询。只是改变ON b1.authorid = a1.id到 其中b1.authorid = a1.id

SELECT * FROM books b1 JOIN (SELECT * FROM authors LIMIT 0,4) a1 where b1.authorid = a1.id 
+0

感谢您的回复。我认为我们可以在内部查询中使用LIMIT,但在parent-query-column中使用它们似乎不可能在MySQL中使用。 – user2587716

+0

是的,它支持连接查询限制。我改变了我的答案。请参阅上面的 –

+0

这样,where子句在应用限制后应用。但是这里需要使用其他方法,这在问题的第一个问题中指定。 – user2587716

0

鉴于你的SQL小提琴,这样的事情应该工作:

SELECT u.* 
     , i.* 
     , x.bid 
     , x.bid_date 
    FROM bids x 
    JOIN bids y 
    ON y.userid = x.userid 
    AND y.bid_date <= x.bid_date 
    JOIN users u 
    ON u.userid = x.userid 
    JOIN items i 
    ON i.itemno = x.itemno 
    GROUP 
    BY userid,bid_date 
HAVING COUNT(*) <= 4; 

SQL Fiddle

+0

对不起。我更新了我的问题。 – user2587716

+0

就希望的结果而言,我希望您发布的表格有一个限制:(每个用户的前四个出价)。这就是为什么我使用限制条款。 – user2587716

+0

[更简单的查询](http://sqlfiddle.com/#!9/7f7a4/2)。 – Dukeling