【问题标题】:CROSS JOIN doesn't work properlyCROSS JOIN 无法正常工作
【发布时间】:2015-06-21 02:26:12
【问题描述】:

任何人都知道查询的可能性: 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 排序的行(无排序依据)。有没有其他解决方案可以做到这一点?

【问题讨论】:

  • 通常情况下,除非您按部分提供顺序,否则无法保证输出顺序。
  • 交叉连接工作​​正常

标签: mysql cross-join


【解决方案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;

【讨论】:

    【解决方案2】:

    首先,您显示的两个结果相同的。在没有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;
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-11
      • 1970-01-01
      • 2023-02-13
      • 2018-02-21
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多