我在 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<=i<=n, 1<=j<=m, 1<=k<=p
所以对于输入(B,D)我应该得到
╔═══╦══════════════╦═════════════╗
║ ║ ║ ║
╠═══╬══════════════╬═════════════╣
║ 1 ║ B<sub>1</sub>║D<sub>1</sub>║
║ 2 ║ B<sub>2</sub>║D<sub>1</sub>║
╚═══╩══════════════╩═════════════╝
我已经用 java 完成了这个任务,但我不知道如何使用 MySQL 来完成这个任务。
如有任何帮助,我们将不胜感激。谢谢。
最佳答案
您想要的是一个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
关于mysql - 使用sql生成组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50093222/