任何人都知道查询的可能性如何:
SELECT a.id, b.id FROM a CROSS JOIN b
和
SELECT 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排序的行(没有顺序)。还有其他解决办法吗?
答案 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;
还有其他解决方案,但这无疑是最好的。