Генерация комбинаций с использованием sql - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть следующие записи в примере базы данных 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 ,. .., B м , ......., Z 1 , Z 2 , ..., Z p

Учитывая пользовательский ввод, например (A,B,Z), я хочу сгенерировать все возможные комбинации из базы данных вида

(A i , B j , Z k )

, где

1 <= i <= n, 1 <= j <= m, 1 <= k <= p </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 голосов
/ 30 апреля 2018

То, что вы хотите - это 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...