我在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来实现这一点。
任何帮助将不胜感激。感谢。
答案 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