CROSS JOIN无法正常工作

时间:2015-06-20 17:06:14

标签: mysql cross-join

任何人都知道查询的可能性如何: SELECT a.id, b.id FROM a CROSS JOIN bSELECT a.id, b.id FROM b CROSS JOIN a 返回相同的结果?在这两种情况下,来自较少数量表的记录被分配给更多的表。我想得到这样的东西:

`| 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排序的行(没有顺序)。还有其他解决办法吗?

2 个答案:

答案 0 :(得分:1)

不,没有ORDER BY,没有特定的订单保证。如果您希望始终维护特定订单,请使用order by子句。所以在你的情况下喜欢

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

我希望每个a.id获得10条记录。

使用LIMIT子句和ORDER BY,如下所示;但是如果不使用ORDER BY,您就无法确保任何订单。查看MySQL文档以获取更多信息。

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

答案 1 :(得分:0)

首先,您显示的两个结果是相同的。如果没有order by子句,SQL结果集(如SQL表)表示无序集。排序并不重要。所以,这些集合都是一样的。

你的问题与此完全不同。如果你想从表b中为表a中的每个记录输入十行,那么你需要枚举它们。通常,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;

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