SELECT z pętlą?

0

Witam. Mam pewien problem z ułożeniem zapytania i chciałbym prosić Was o pomoc.

Załóżmy, że mam zbiór książek, i do danej książki mogę przypisać kilka innych książek jako "Podobne".
Gdy wyjdzie kontynuacja jakiejś książki, to męczące jest przypisywanie jej osobno do każdej podobnej książki. Skoro poprzednie części tej książki są już przypisane do jakichś "podobnych" książek, to czy nie wystarczyłoby zapisanie tej nowej części książki, do jednej podobnej książki, i po prostu wyświetlać tą przypisaną jedną książkę (jako "podobną") i książki przypisane jako "Podobne" do tej przypisanej książki?
Np. Książka "Więzień labiryntu" ma przypisane jako podobne, wszystkie części książki "Igrzyska śmierci", a do jednej części "Igrzysk śmierci" jest przypisana książka "Podróż do wnętrza ziemi" i chodzi o to, by wszystkie te powiązane książki wyświetliło.

Tu obrazek wyjaśniający te powiązania: http://imgur.com/BXnZZRm
Chodzi o to, bym nie musiał przypisywać każdej książki osobno, tylko jeśli przypiszę do jednej, to żeby wyświetliło je wszystkie.
W php potrzebna by była pętla żeby zrobić te wszystkie iteracje jak przy sortowaniu, ale tutaj w MySQL nie wiem czy da się takie coś pobrać.

Będę wdzięczny za pomoc.

1

Użyj join.

0

Bo ja wiem, jeśli chcesz pętle to możesz używać takowych w funkcjach albo procedurach.

1

To zależy od kryterium podobieństwa.

Generalnie wydaje mi się, że istnieje kilka sposobów na realizację Twoich postulatów, ale widzę dwa najprostsze.

  1. Każda książka ma przypisaną grupę w encji. Każda książka jest podobna do wszystkich książek z grupy.

Np.

Table Books
ID;Title;Group
1;"BookA";1
2;"BookB";1
3;"BookC";1
4;"BookD";2

W takim schemacie BookA jest podobna do BookB i BookC, ale nie do BookD.

Mając ID BookA z łatwością wyciągniesz książki podobne (

SELECT * 
FROM Books 
WHERE 1=1
AND ID <> JAKIEŚ_ID 
AND Group = (SELECT GROUP FROM Books WHERE ID = JAKIEŚ_ID)

lub

SELECT b2.* 
FROM Books b1
JOIN Books b2 ON b1.GROUP = b2.GROUP AND b2.ID <> b1.ID
WHERE b1.ID = JAKIEŚ_ID

)
I wtedy po prostu dodajesz nową książkę do tej grupy.

  1. Tworzysz oddzielną tabelę określającą podobieństwa, tj.
Table Books
ID;Title
1;"BookA"
2;"BookB"
3;"BookC"
4;"BookD"

Table BooksSimilarities
ID;SimilarID
1;2 -- BookA jest podobna do BookB i BookC
1;3
2;1 -- BookB jest podobna do BookA
3;4 -- BookC jest podobna do BookA i BookD
3;1
4;3 -- BookD jest podobna do BookC

I wtedy mając ID książki także łatwo wyciągnąć zależność:

SELECT b.* 
FROM Books b
JOIN BooksSimiliarities bs ON b.ID = bs.SimilarID
WHERE bs.ID = JAKIEŚ_ID;

Wtedy, jeśli chcesz dodać np. BookE która jest podobna do tych samych książek co BookA piszesz:

INSERT INTO Books VALUES (6, "BookE");
INSERT INTO BooksSimilarities (
	SELECT 6, SimiliarID
	FROM BooksSimilarities 
	WHERE ID = 1
);

1 użytkowników online, w tym zalogowanych: 0, gości: 1