插入所有组合的最佳方式

时间:2014-08-17 21:24:15

标签: mysql

我一直在考虑它,似乎无法找到在普通mysql中实现它的方法。

我有一个单词列表(大小不固定):

  • word11
  • word21
  • word31
  • word41

对于这些单词中的每一个,我都有一个同义词列表(大小不固定)。对于word11,对于intance:

  • word12
  • word13
  • word14
  • word15
  • WORD16

我的目标是获得所有不同的可能性:

  • word11 word21 word31 word41
  • word12 word21 word31 word41
  • word13 word21 word31 word41
  • word14 word21 word31 word41
  • ...
  • word11 word21 word31 word417
  • word11 word21 word31 word418

我考虑使用临时表来存储不同的结果。

对于每个单词,以及存储在临时表中的每个结果,请插入新的同义词。

word11的第一次迭代将给出

  • word11 word21 word31 word41
  • word12 word21 word31 word41
  • word13 word21 word31 word41
  • word14 word21 word31 word41
  • word15 word21 word31 word41
  • word16 word21 word31 word41

对于迭代2,对于这些条目中的每一个,通过用其同义词替换word21来插入同义词。

但这似乎非常乏味,可能有更好的方法(甚至不确定它是否会接近实际工作)。

任何提示?

1 个答案:

答案 0 :(得分:1)

不幸的是,MySQL不支持递归或分层查询,这是真正需要的。对于固定数量的单词,您可以这样做:

select w1.synonym, w2.synonym, w3.synonym, w4.synonym
from synonyms w1 cross join
     synonyms w2 cross join
     synonyms w3 cross join
     synonyms w4
where w1.word = 'word1' and
      w2.word = 'word2' and
      w3.word = 'word3' and
      w4.word = 'word4';

(实际上,除非你有一个单词是它自己的同义词,否则查询会更复杂,但这是对上述查询的一个简单的修复)。

为了添加更多单词,您需要更多联接,唉。如果您有固定的号码,那么您可以对其进行硬编码。否则,您可以将SQL生成为预准备语句,然后执行。特定的SQL类似于:

   select concat('select ', group_concat('w_', word, '.word' separator ', '),
                 ' from ',
                 group_concat('synonyms w_', word separator ' cross join '),
                 ' where ',
                 group_concat('w_', word, ' = ''', word, '''' separator ' and '
                )
   from words w;