2011-09-28 12 views
5

Zajmuję się tworzeniem strony, na której ludzie mogą publikować swoje domy do wynajęcia. Używam PHP 5.2.0 i MySQL 5+Jak dołączyć do wielu tabel powiązanych z innymi tabelami

publikacje są przechowywane w tabeli jak to

ta_publications 
+---+-------------+------+ 
|id | name  | date | 
+---+-------------+------+ 
| 1 | name_001 | ... | 
| 2 | name_002 | ... | 
| 3 | name_003 | ... | 
+---+-------------+------+ 

mam zmierzających publikacje, które mają "cechy", takie jak "internet", „made usługa "," telewizja satelitarna "itp.

Te funkcje mogą ulec zmianie w przyszłości. Chcę je dodawać/usuwać/modyfikować, więc zapisuję je w bazie danych w tabeli.

ta_features 
+---+-------------+ 
|id | name  | 
+---+-------------+ 
| 1 | Internet | 
| 2 | Wi-Fi  | 
| 3 | satelital tv| 
+---+-------------+ 

które są związane z publikacjami stosując następującą tabelę

ta_publication_features 
+---+-------------+----------------+ 
|id | type_id | publication_id | 
+---+-------------+----------------+ 
| 1 |  1  |  1  | 
| 2 |  2  |  1  | 
| 3 |  3  |  1  | 
+---+-------------+----------------+ 

Myślę, że to dość łatwe do zrozumienia; Istnieje publikacja o nazwie name_001, która ma Internet, Wi-Fi i telewizję satelitarną.

mam te same dane ze schematu dla obrazów, przechowywać je w tej tabeli

ta_images 
+---+-------------+ 
|id | src   | 
+---+-------------+ 
| 1 | URL_1  | 
| 2 | URL_2  | 
| 3 | URL_3  | 
+---+-------------+ 

i skorzystać z poniższej tabeli odnoszą je do publikacji

ta_publication_images 
+---+-------------+----------------+----------+ 
|id | img_id  | publication_id | order | 
+---+-------------+----------------+----------+ 
| 1 |  1  |  1  | 0  | 
| 2 |  2  |  1  | 1  | 
| 3 |  3  |  1  | 2  | 
+---+-------------+----------------+----------+ 

kolejność kolumna podaje kolejność, w której publikacje powinny być wyświetlane podczas wyświetlania pojedynczej publikacji.

Philipp Reichart dostarczył mi zapytanie, które wyszuka i uzyska wszystkie publikacje z pewnymi funkcjami. Działa na potrzeby publikowania publikacji, nie mogę go zmodyfikować, aby zwrócić mi potrzebne dane.

Więc pomyślałem, że uruchomię to zapytanie i zdobędę wszystkie publikacje, które spełniają kryteria wyszukiwania, a następnie wykorzystam inne zapytanie do ich wyświetlenia.

Lista tych publikacji zawiera wszystkie dane publikacji (wszystko na ta_publikacjach) + wszystkie jego funkcje + najważniejsze (zamówienie 0) obraz src.

Mogę, dla każdej publikacji, mieć dwa proste zapytania, które będą zwracać, oddzielnie, najważniejszy obraz i wszystkie jego funkcje, ale przy wyświetlaniu 25 publikacji na stronie będzie to 1 zapytanie wyszukiwania + (2 kwerendy na publikację * 25 publikacji) = 51 różnych zapytań, wyraźnie niezbyt wydajnych.

EDIT:

Moje pytanie jest, w jaki sposób można utworzyć kwerendę SQL, który, biorąc pod uwagę niektóre identyfikatory publikacji, powróci: wszystkie dane publikacji (wszystko na ta_publications) + wszystkich jego funkcje + najważniejszym (zamów 0) image src

+0

Dobrze napisany pytanie skoro jesteś tak nowy. :) + głosuj – Layke

+0

Nie zadałeś właściwie pytania. Pokaż, co chcesz osiągnąć. –

+0

Pytasz więc o zapytanie, które zwraca wszystkie publikacje według identyfikatora, łącznie z ich funkcjami i górnym obrazem? –

Odpowiedz

1

Dostaniesz nadmiarowych publikacji i obrazowych z tym jednym, ale tutaj jest sposób, aby to zrobić za pomocą jednego zapytania:

SELECT p.id, p.name, p.date, 
      f.id, f.name, 
      i.id, i.src 
    FROM ta_publications p 
    JOIN ta_publication_features pf ON p.id = pf.publication_id 
    JOIN ta_features f ON f.id = pf.type_id 
    JOIN ta_publication_images pi ON p.id = pi.publication_id 
     AND pi.order = 0 
    JOIN ta_images i ON i.id = pi.img_id 
    WHERE p.id IN ( -- list of publication ids); 
+0

działa, ale daje nadmiarowe dane, tak jak powiedziałeś. czy istnieje sposób na uniknięcie zbędnych danych? – Daniel

+0

Nie można tego obejść, biorąc pod uwagę naturę relacji. –

+0

Co jest lepsze, pod względem wydajności, użyj zapytania, aby uzyskać możliwe identyfikatory, a następnie użyj zapytania, aby uzyskać informacje o wykazie, usunąć nadmiarowość za pomocą PHP lub użyć zapytania, a następnie dla każdej publikacji, wykonaj 1 zapytanie, aby uzyskać IMG i drugie zapytanie, aby uzyskać listę wszystkich funkcji? Ta druga opcja jest o wiele prostsza i bardziej przewidywalna, ale wymaga wielu zapytań. Myślę, że będzie łatwiejsze do stronicowania z drugą opcją. Co myślisz? – Daniel

1
Select pub.Name as [Publication], f.name as [Feature], i.name as [Image] from ta_publications pub 
Join ta_publications_features pf on pf.publication_id = pub.id 
Join ta_features f on f.id = pf.type_id 
Join ta_publication_images pi on pi.publication_id = pub.id 
Join ta_images i on i.id = pi.img_id 
Where pub.id = 'appropriate id' 
order by i.[order] 

Jeśli poprawnie podążyłem za twoją strukturą, to powinno ci dać potrzebne sprzężenia. i możesz dodać żądane kolumny do wyniku w wybranej statucie, dodając .. nadzieję, że to pomaga.

+0

można wziąć out (gdzie pub.id = "odpowiedni identyfikator"), jeśli chcesz wszystkie publikacje i od tego chcesz top img po prostu zamień zamówienie przez whith (gdzie i.order = 0) –

+0

dla publikacji z 6 funkcjami i 3 fotki, rzuca mi 18 rzędów. Na każde zdjęcie składa się z 6 wierszy, z których każdy ma inną funkcję. – Daniel

+0

dodanie pi.order = 0 pomaga nieco problemu, teraz zwraca wiersz dla każdej funkcji. – Daniel