CROSS JOIN 无法正常工作

CROSS JOIN doesn't work properly

任何人都知道查询的可能性: SELECT a.id, b.id FROM a CROSS JOIN bSELECT 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;

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