单列表的MySQL排列

时间:2014-09-06 15:12:10

标签: mysql relational-database permutation

这里有点数据库新手。我有一个表格列表:

author_id   book_id(PK)   book_title   other_book_info
======================================================
1           1             Grass        etc.
1           2             Fire         etc.
2           3             Green        etc.
2           4             Red          etc.

我有兴趣将来自Author1的所有书籍与来自Author2的所有书籍进行匹配,并将其与一些名为book_similarity的相关性(在问题范围之外)进行匹配。创建这样的所有排列表的最佳实践方法是什么?:

sim_id(PK)   book_id1    book_id2     book_similarity
=====================================================
1            1           3            High
2            1           4            Low
3            2           3            Low
4            2           4            High

书籍相似性是可交换的(即匹配 1 vs. 3 3 vs. 1 相同)所以我只需要书名的排列,而不是组合。

但是,我怀疑最佳做法是创建一个包含16行的所有组合的较长表,这样如果我正在寻找特定的书(比如说#4),我只需要看一下在book_id1而不是book_id1和book_id2。什么是共识?

1 个答案:

答案 0 :(得分:1)

您想要cross join并选择您想要的特定作者:

select (@rn := @rn + 1) as id, b1.book_id as book_id1, b2.book_id as book_id2,
       YOURSIMILARITYFUNCTIONHERE
from books b1 cross join
     books b2 cross join
     (select @rn := 0) vars
where b1.author_id = 1 and b2.author_id = 2;

如果没有where,则会选择所有成对组合。