2009-09-10 45 views
12

Tôi đang tạo nguồn cấp dữ liệu RSS bằng PHP sử dụng dữ liệu từ ba bảng riêng biệt. Tất cả các bảng đều đề cập đến các trang trong các khu vực khác nhau của trang web. Vấn đề tôi đang cố gắng tạo ra các trường liên kết trong XML. Nếu không biết bảng nào từng bản ghi đến từ, tôi không thể tạo liên kết chính xác cho nó.SQL - Xác định bảng nguồn từ truy vấn UNION

Có cách nào để giải quyết vấn đề này không? Tôi đã thử sử dụng mysql_fetch_field, nhưng nó trả về giá trị trống cho các bảng.

$sql = " 
SELECT Title FROM table1 
UNION 
SELECT Title FROM table2 
UNION 
SELECT Title FROM table3"; 

Có các trường khác liên quan, nhưng về cơ bản đây là truy vấn tôi đang sử dụng.

Mọi trợ giúp sẽ được đánh giá cao.

Cảm ơn.

Trả lời

10

nên được dễ dàng đủ, chỉ cần làm một cái gì đó như thế này:

$sql = " 
SELECT Title, 1 FROM table1 
UNION 
SELECT Title, 2 FROM table2 
UNION 
SELECT Title, 3 FROM table3"; 
+1

Vì sẽ không có bất kỳ bản sao nào cần xóa khi bạn thực hiện việc này, hãy sử dụng Liên minh. – HLGEM

22

Chỉ cần thêm một hằng số vào danh sách cột của bạn như sau:

select 'table1' as table_name, title from table1 
union all 
select 'table2' as table_name, title from table2 
union all 
select 'table3' as table_name, title from table3 

đó sẽ giúp bạn có một cái gì đó như:

table_name | title 
-----------+----------------------------- 
table1  | war and peace 
table2  | 1984 
table3  | terminator salvation 

v.v.

Điều này cho phép bạn có các loại dữ liệu chuỗi có khả năng làm cho chuyển đổi của bạn thành liên kết dễ dàng hơn (đặc biệt nếu bạn sử dụng giá trị chỉ cần sao chép vào trang thay vì được tra cứu hoặc chuyển đổi) và sử dụng mệnh đề as cho phép bạn tham chiếu nó giống như bất kỳ cột nào khác (theo tên).

Lưu ý việc sử dụng union all - nếu bạn chắc chắn rằng sẽ không có hàng trùng lặp từ các bảng (đó là lẽ đúng trong trường hợp này kể từ khi bạn có một table_name giá trị khác nhau cho mỗi và tôi giả định tiêu đề là duy nhất), union all có thể tránh hoạt động sắp xếp và loại bỏ bị lãng phí. Việc sử dụng union có thể khiến công việc không cần thiết phải được thực hiện.

Nếu bạn muốn xóa trùng lặp hoàn tất, chỉ cần hoàn nguyên về sử dụng union.

+0

Thực hiện việc này có thể dẫn đến các bản ghi trùng lặp bất kể bạn sử dụng công đoàn hay công đoàn tất cả. – Zoop

0

Thêm cột giả với một biến cố định. Ví dụ. "Chọn 'funky_table' dưới dạng source_table, tiêu đề từ funky_table" cho mỗi mệnh đề nhưng có tên khác nhau trong dấu ngoặc kép.

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