2015-06-20 59 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;