【问题标题】:Generating combinations using sql使用 sql 生成组合
【发布时间】:2018-04-30 11:51:50
【问题描述】:

我在 MySQL 示例数据库中有以下记录。

╔═══╦══════════════╦═════════════╗
║   ║ Title        ║ Value       ║
╠═══╬══════════════╬═════════════╣
║ 1 ║ A<sub>1</sub>║ 1           ║
║ 2 ║ A<sub>2</sub>║ 10          ║
║ 3 ║ A<sub>3</sub>║ 3           ║
║ 4 ║ B<sub>1</sub>║ 5           ║
║ 5 ║ B<sub>2</sub>║ 7           ║
║ 6 ║ C<sub>1</sub>║ 8           ║
║ 7 ║ C<sub>2</sub>║ 23          ║
║ 8 ║ D<sub>1</sub>║ 3           ║
║ 9 ║ Z<sub>1</sub>║ 0           ║
║ 10║ Z<sub>2</sub>║ 11          ║
║ 11║ Z<sub>3</sub>║ 22          ║
╚═══╩══════════════╩═════════════╝

通常记录有这么多: A1, A2, ... , An, B1, B2, ... , Bm, ......... , Z1, Z2, ... , Zp

给定一个用户输入,例如(A,B,Z),我想从表单的数据库中生成所有可能的组合

(Ai, Bj, Zk)

在哪里

1

所以对于输入 (B,D) 我应该得到

╔═══╦══════════════╦═════════════╗
║   ║              ║             ║
╠═══╬══════════════╬═════════════╣
║ 1 ║ B<sub>1</sub>║D<sub>1</sub>║
║ 2 ║ B<sub>2</sub>║D<sub>1</sub>║
╚═══╩══════════════╩═════════════╝

我已经在 java 中完成了这项工作,但我不知道如何使用 MySQL 来完成这项工作。

任何帮助将不胜感激。谢谢。

【问题讨论】:

  • MySQL 不是 PLSQL,它是 Oracle。请将您的数据作为实际表格发布。
  • @TimBiegeleisen 对不起,我的错。已编辑

标签: mysql sql


【解决方案1】:

您想要的是一个CROSS JOIN,它会生成正在连接的表中所有可能的行组合。所以如果你这样做了

SELECT * FROM table t1 
  CROSS JOIN table t2
  CROSS JOIN table t3;

你会得到几乎所有可能的三元组变量。然后,您可以为相关三元组添加WHERE 条件:

SELECT * FROM table t1 
  CROSS JOIN table t2
  CROSS JOIN table t3
WHERE t1.Title LIKE 'A%'
  AND t2.Title LIKE 'B%'    
  AND t3.title LIKE 'C%';

这会给你所有 (A,B,C) 三胞胎。

如果您的表很大,那么您的交叉连接将变得不切实际,因此通常最好交叉连接子查询:

SELECT * FROM
  (SELECT * FROM table WHERE Title LIKE 'A%') t1
  CROSS JOIN (SELECT * FROM table WHERE Title LIKE 'B%') t2
  CROSS JOIN (SELECT * FROM table WHERE Title LIKE 'C%') t3;

这将在相乘之前修剪相关行。这几乎总是更有效。

https://www.w3resource.com/mysql/advance-query-in-mysql/mysql-cross-join.php

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-03
    • 2011-04-10
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多