这里有点数据库新手。我有一个表格列表:
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。什么是共识?
答案 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
,则会选择所有成对组合。