Cách tạo variable tùy thuộc vào table name trong MySQL query
Giả sử mình có 4 tables: a_table, b_table, c_table, d_table. Mỗi Table có nhiều column, nhưng mình chọn hàm SELECT 3 column trong số đó là title, content và date.
MySQL query đại khái thế này
$PostArray = SELECT title, content, date FROM a_table, b_table, c_table, d_table ORDER BY date DESC
LIMIT 1;
Bây giờ mình muốn khai varial $source tùy thuộc vào Table nào được chọn. Đại khái thế này, nhưng mình không biết làm sao cho đúng.
IF ( The a_table is selected) { $source= 'Alibaba';}
IF (The b_table is selected) { $source= 'The Adventures of Sinbad';}
IF (The c_table is selected) { $source= 'Taylor Swift';}
IF (The d_table is selected) { $source= 'AC Milan';}
Kết quả output như thế này:
FOREACH ($PostArray as $post)
{
ECHO '<h1>'.$post['title'].'</h1>';
ECHO '<p>'.$post['content'].'</p>';
ECHO '<span>Posted on'.$post['date'].'</span>';
ECHO '<span>Source:'.$source.'</span>';
}
2 CÂU TRẢ LỜI
Qua comment của bạn trả lời thì mình nghĩ là có thể dùng truy vấn UNION trong sql như dưới đây (ví dụ có 2 bảng).
(SELECT *,
'a' AS source
FROM a_table
ORDER BY date DESC
LIMIT 1)
UNION
(SELECT *,
'b' AS source
FROM b_table
ORDER BY date DESC
LIMIT 1);
Câu này sẽ giúp lấy 1 record mới nhất của mỗi bảng a_table và b_table và bạn cũng sẽ biết được source
nó thuộc từ bảng nào. Bạn thử kiểm tra xem được không nhé.
Cảm ơn bạn. Mình không biết UNION và UNION ALL có khác nhau không trong trường hợp này?
@dokkan7 Trường hợp này mình nghĩ là bạn có thể dùng UNION hay UNION ALL đều được. UNION và UNION ALL chỉ khác nhau là một cái chỉ lấy dữ liệu khác biệt (distinct), một cái thì lấy tất.
Chào các bạn.
Do mình dùng function làm sẵn của CMS, nên mình đã dùng những Query riêng lẻ với virtual column:
SELECT title, content, date, "alibaba" AS source FROM alibaba_posts
ORDER BY date DESC LIMIT 1
Sau đó dùng array_merge để nối các Array lại. Về cơ bản, cũng giống như Union ở trên.
Xin cảm ơn tất cả!
Theo việc bạn trả lời anh bên Trần Xuân Thắng thì mình sẽ hiểu 4 bảng này có cấu trục giống hệt nhau nhưng bạn lại bắt buộc phải tách ra (cái này thì minh k hiểu tại sao phải tách ra nên mình sẽ mặc định cho rằng cách làm của bạn là đúng). Theo mình nghĩ bạn có thể tạo ra 4 biến, mỗi biến được truy vấn từ 1 bảng, sau đó đưa hết vào 1 array xem sao?
Có lẽ mấy bảng này được tạo ra bởi CMS như wordpress trong lúc cài đặt. Và ở đây là có nhiều trang riêng biệt hoàn toàn nhưng dùng chung trong một database. CMS thường cho tạo thêm prefix cho các bảng, chính là mấy cái a, b,... ở trên, tốt cho mấy hosting chơi trò giới hạn số lượng database được tạo.
Đúng vậy, đó là một dạng CMS dạng Q&A, về cơ bản thì cũng như Wordpress thôi. Ban đầu mình dùng chung 1 database, 1 table về bài đăng. Mỗi bài đăng có category riêng. Nhưng phát sinh khá nhiều thứ linh ta linh tinh khác như search không thể tìm riêng 1 category, tag dùng chung nên bị chồng chéo. Category là dạng ảo, nên đường link URL của bài đăng kém hiệu quả SEO.... Nên mình chuyển sang dùng mỗi category là mỗi chuyên mục sẽ có 1 table riêng về bài đăng, nhưng users là dùng chung, giải quyết được khá nhiều điều.
Bạn nói rõ hơn về cấu trúc của 4 bảng a_table, b_table, c_table, d_table và tên thật của nó luôn được không. Mình thấy là việc bạn cần làm như trên cho thấy là từ quá trình thiết kế CSDL đã có vấn đề rồi. Nếu 4 bảng trên cấu trúc tương tự nhau, vậy tại sao không định nghĩa chỉ một bảng, mà lại phải tạo ra thành 4 bảng?
@tranxuanthang Chào bạn, 4 bảng này nằm trong 4 CMS installation cùng thuộc 1 database. Do 4 installation này sẽ tạo ra 4 trang độc lập nhau. Đơn giản dễ hiểu là 4 table này có liên quan đến 4 trang ví dụ như anime.mydomain.com, movie.mydomain.com, donaldtrump.mydomain.com....
Bây giờ mình cầy lấy mỗi table 1 record mới nhất rồi trả kết quả dạng tổng hợp bài đăng mới nhất.
4 bảng này có cấu trức ý chang nhau. Không gom chung lại được vì còn dính nhiều thứ khác như "search".
Tên thật của mấy cái table: leaugueoflegends_posts, onepiece_posts,....