2015-06-20 42 views
0

任何人都知道它可能如何查询: SELECT a.id, b.id FROM a CROSS JOIN bSELECT a.id, b.id FROM b CROSS JOIN a 返回相同的结果?在这两种情况下,来自不太多的表格的记录被分配到更多的表格。我想是这样的:CROSS JOIN无法正常工作

`| a.id | b.id | 
-------+-----+ 
    1 | q | 
    1 | w | 
    1 | e | 
    1 | r | 
    2 | q | 
    2 | w | 
    2 | e | 
    2 | r | 

`

但即时得到结果是这样的:

`| a.id | b.id | 
-------+-----+ 
    1 | q | 
    2 | q | 
    1 | w | 
    2 | w | 
    1 | e | 
    2 | e | 
    1 | r | 
    2 | r | 

`

它还挺奇怪的是,MySQL自动选择交叉的顺序加入提交取决于他们众多。我知道我可以使用ORDER BY,但我需要通过CROSS JOIN来完成。

还有更复杂的问题,我想每a.id获得10条记录。我看到了解决方案:在SELECT子句中使用IF条件进行行计数。该行计数需要按原始结果中的a.id排序的行(不包括order by)。有没有其他解决方案来做到这一点?

+2

通常,除非您按部分提供订单,否则不能保证输出订单。 – Tim3880

+0

交叉连接工作​​得很好 – Strawberry

回答

0

首先,这两个结果的,你告诉相同。没有order by子句,SQL结果集(如SQL表)代表无序的集。排序并不重要。所以,这些集合是相同的。

你的问题是完全不同的。如果您希望表a中每条记录的表b有10行,那么您需要枚举它们。通常情况下,在MySQL中最快的方法是使用子查询和变量:

select a.*, b.* 
from a left join 
    (select b.*, 
      (@rn := if(@a = b.aid, @rn + 1, 
         if(@a := b.aid, 1, 1) 
         ) 
      ) as seqnum 
     from b cross join 
      (select @rn := 0, @a := 0) params 
     order by b.aid 
    ) b 
where seqnum <= 10 
order by a.aid; 

还有其他的解决方案,但是这无疑是最好的。

+0

非常感谢!这个查询解决了我的问题:) – fraxe

1

不,没有ORDER BY没有特定的顺序保证。如果您希望始终保持特定的订单,请使用order by条款。所以你的情况做这样

SELECT a.id, b.id FROM a CROSS JOIN b 
ORDER BY a.id; 

我想10个记录每a.id.

使用LIMIT从句与ORDER BY类似,如下所示;但不使用ORDER BY你永远不能保证任何顺序。有关更多信息,请参阅MySQL文档。

SELECT a.id, b.id FROM a CROSS JOIN b 
ORDER BY a.id 
LIMIT 0,10;