2011-09-28 33 views
5

Tôi đang phát triển một trang web nơi mọi người có thể công bố nhà của họ cho thuê. Tôi đang sử dụng php 5.2.0 và MySQL 5 +Cách tham gia nhiều bảng liên quan đến các bảng khác

các ấn phẩm được lưu trữ trong một bảng như thế này

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

Tôi có ấn phẩm khác nhau, trong đó có "tính năng" như "internet", "made dịch vụ "," truyền hình vệ tinh ", v.v ..

Các tính năng này có thể thay đổi trong tương lai và tôi muốn có thể thêm/xóa/sửa đổi chúng, vì vậy tôi lưu trữ chúng trong cơ sở dữ liệu trong bảng.

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

có liên quan đến các ấn phẩm bằng cách sử dụng bảng sau

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

Tôi nghĩ nó khá dễ hiểu; Có một ấn phẩm được gọi là name_001 có internet, wi-fi và truyền hình vệ tinh.

tôi có cùng một dữ liệu schema cho những hình ảnh, tôi lưu trữ chúng trong bảng này

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

Và sử dụng bảng sau để gắn chúng với các ấn phẩm

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

thứ tự cột cho thứ tự các ấn phẩm cần được hiển thị khi liệt kê một ấn phẩm đơn lẻ.

Philipp Reichart cung cấp cho tôi một truy vấn sẽ tìm kiếm và nhận tất cả các ấn phẩm có các tính năng nhất định. Nó hoạt động để liệt kê các ấn phẩm, tôi không thể sửa đổi nó để trả lại dữ liệu tôi cần.

Vì vậy, tôi figured tôi sẽ chạy truy vấn đó và nhận được tất cả các ấn phẩm mà vượt qua các tiêu chí tìm kiếm và sau đó sử dụng một truy vấn để liệt kê chúng.

Danh sách các ấn phẩm này phải bao gồm tất cả dữ liệu xuất bản (mọi thứ trên ta_publications) + tất cả các tính năng của nó + src ảnh quan trọng nhất (thứ tự 0). Tôi có thể, đối với mỗi ấn phẩm, có hai truy vấn đơn giản sẽ trả về, riêng biệt, hình ảnh quan trọng nhất và tất cả các tính năng, nhưng khi liệt kê 25 ấn phẩm trên mỗi trang, nó sẽ là 1 truy vấn tìm kiếm + (2 truy vấn trên mỗi ấn phẩm * 25 ấn phẩm) = 51 truy vấn khác nhau, rõ ràng không hiệu quả lắm.

EDIT:

Câu hỏi của tôi là, làm thế nào tôi có thể tạo ra một truy vấn SQL, đưa ra một số id xuất bản, sẽ trở lại: tất cả các dữ liệu công bố (tất cả mọi thứ trên ta_publications) + tất cả các tính năng của nó + quan trọng nhất (theo thứ tự 0) image src

+0

Cũng bằng văn bản câu hỏi vì bạn rất mới. :) + bỏ phiếu – Layke

+0

Bạn chưa thực sự đặt câu hỏi. Hiển thị những gì bạn đang cố gắng đạt được. –

+0

Vì vậy, bạn có yêu cầu một truy vấn trả về tất cả các ấn phẩm, theo id, bao gồm các tính năng và hình ảnh hàng đầu của họ không? –

Trả lời

1

Bạn sẽ nhận được thừa xuất bản và hình ảnh dữ liệu với một điều này, nhưng đây là một cách để làm điều đó với một truy vấn:

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

nó hoạt động nhưng cung cấp dữ liệu thừa, như bạn đã nói. có cách nào để tránh nhận dữ liệu dư thừa này không? – Daniel

+0

Không có cách nào xung quanh nó, vì bản chất của mối quan hệ. –

+0

Và điều gì là tốt hơn, hiệu quả khôn ngoan, sử dụng truy vấn tìm kiếm để có được các ID có thể và sau đó sử dụng truy vấn của bạn để có được thông tin cho danh sách, loại bỏ sự dư thừa với PHP, hoặc sử dụng truy vấn tìm kiếm và sau đó cho mỗi ấn phẩm, 1 truy vấn để có được IMG và truy vấn thứ hai để có danh sách tất cả các tính năng? Tùy chọn thứ hai này là cách đơn giản hơn một cách dễ đoán trước, nhưng sử dụng rất nhiều truy vấn. Tôi nghĩ rằng sẽ dễ dàng hơn để phân trang với tùy chọn thứ hai. Bạn nghĩ sao? – 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] 

Nếu tôi đã theo đúng cấu trúc của bạn, điều này sẽ cung cấp cho bạn các kết nối bạn cần. và bạn có thể thêm các cột mong muốn vào kết quả trong statment được chọn bằng cách thêm .. hy vọng điều này sẽ giúp.

+0

ra (nơi pub.id = 'id thích hợp') nếu bạn muốn tất cả các ấn phẩm và vì bạn muốn img hàng đầu chỉ thay thế thứ tự bằng whith (trong đó i.order = 0) –

+0

để xuất bản với 6 tính năng và 3 bức ảnh, nó ném tôi 18 hàng. Đối với mỗi pic nó cho 6 hàng, mỗi hàng với một tính năng khác nhau. – Daniel

+0

thêm pi.order = 0 giúp khắc phục sự cố, giờ đây nó trả về một hàng cho mỗi đối tượng địa lý. – Daniel

Các vấn đề liên quan