mysql - 使用sql生成组合

标签 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          ║
╚═══╩══════════════╩═════════════╝

一般记录有这么多: 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/

相关文章:

mysql - 如何在 R 中执行 dbGetQuery for 循环

php - AJAX 没有显示来自服务器请求的数据

sql - oracle sql TO_CHAR 函数在某些情况下添加尾随空白

php - 从 SQL 打印到 PHP?

mysql - 在mysql中对一个非常大的表进行分区或分离

MySQL-将计数插入表中

php mysql 结果每次都从 php 返回错误,但在 sql pro 和 phpmyadmin 中没问题

java - Android Studio SQLiteOpenHelper "DATABSE has no column named NAME"

sql - 显式调用事务回滚还是让异常触发隐式回滚是更好的做法吗?

PHP MySQL查询按1个月之前的日期显示表的当前日期