CROSS JOIN 无法正常工作
CROSS JOIN doesn't work properly
任何人都知道查询的可能性:
SELECT a.id, b.id FROM a CROSS JOIN b
和
SELECT a.id, b.id FROM b CROSS JOIN a
return 一样的结果?在这两种情况下,数量较少的 table 的记录都分配给数量较多的 table。我想得到这样的东西:
`| 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 自动选择交叉连接的顺序 tabled 取决于它们的数量。我知道我可以使用 ORDER BY 但我需要通过 CROSS JOIN 来做到这一点。
还有更复杂的问题,我想每个 a.id 获得 10 条记录。我看到了解决方案:在 SELECT 子句中使用 IF 条件进行行计数。该行计数需要在原始结果中按 a.id 排序的行(没有排序依据)。还有其他解决方案吗?
不,如果没有 ORDER BY
,则无法保证特定的顺序。如果您希望始终维护特定顺序,请使用 order by
子句。所以在你的情况下喜欢
SELECT a.id, b.id FROM a CROSS JOIN b
ORDER BY a.id;
i want to get 10 records per 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;
首先,您显示的两个结果相同。没有 order by
子句,SQL 结果集,如 SQL tables,表示 无序 集。顺序是无关紧要的。所以,集合是一样的。
你的问题与此截然不同。如果 table a 中的每条记录都需要 table b 中的十行,则需要枚举它们。通常,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;
还有其他解决方案,但这无疑是最好的。
任何人都知道查询的可能性:
SELECT a.id, b.id FROM a CROSS JOIN b
和
SELECT a.id, b.id FROM b CROSS JOIN a
return 一样的结果?在这两种情况下,数量较少的 table 的记录都分配给数量较多的 table。我想得到这样的东西:
`| 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 自动选择交叉连接的顺序 tabled 取决于它们的数量。我知道我可以使用 ORDER BY 但我需要通过 CROSS JOIN 来做到这一点。
还有更复杂的问题,我想每个 a.id 获得 10 条记录。我看到了解决方案:在 SELECT 子句中使用 IF 条件进行行计数。该行计数需要在原始结果中按 a.id 排序的行(没有排序依据)。还有其他解决方案吗?
不,如果没有 ORDER BY
,则无法保证特定的顺序。如果您希望始终维护特定顺序,请使用 order by
子句。所以在你的情况下喜欢
SELECT a.id, b.id FROM a CROSS JOIN b
ORDER BY a.id;
i want to get 10 records per 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;
首先,您显示的两个结果相同。没有 order by
子句,SQL 结果集,如 SQL tables,表示 无序 集。顺序是无关紧要的。所以,集合是一样的。
你的问题与此截然不同。如果 table a 中的每条记录都需要 table b 中的十行,则需要枚举它们。通常,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;
还有其他解决方案,但这无疑是最好的。