2014-09-06 6 views
0

Бит базы данных новичка здесь. У меня есть список таблиц это:Перестановки MySQL одного списка

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 против 3 такое же, как 3 по сравнению с 1), поэтому я нужны только перестановки названий книг, а не комбинации.

Однако я подозреваю, что было бы лучше всего создать более длинный стол со всеми комбинациями, имеющими 16 строк, чтобы, если я ищу конкретную книгу (скажем, № 4), мне нужно только посмотреть book_id1, а не book_id1 и book_id2. Каков консенсус?

ответ

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, это будет выбирать все попарные комбинации.

+0

Спасибо - это действительно полезно. Я думаю, что в конечном итоге буду использовать 'WHERE b1.author_id! = B2.author_id'. Это дает мне перекрестные сравнения со всеми необходимыми мне книгами и полный столбец поиска (book_id2), в котором есть каждая запись книги. – HMcG