使用sql生成组合

时间:2018-04-30 02:21:22

标签: mysql sql

我在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          ║
╚═══╩══════════════╩═════════════╝

一般来说,记录会是这么多: A 1 ,A 2 ,...,A n ,B 1 ,B 2 < / sub>,...,B m ,.......,Z 1 ,Z 2 ,..., ž<子> p

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

  

(A i ,B j ,Z k

其中

  

1&lt; = i&lt; = n,1&lt; = j&lt; = m,1&lt; = k&lt; = p

因此对于输入(B,D)我应该

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

我已经在java中完成了这个,但我不知道如何使用MySQL来实现这一点。

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

1 个答案:

答案 0 :(得分:0)

您想要的是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