Asked Aug 10th, 2020 7:17 AM 121 0 2
  • 121 0 2
0

Cách tạo variable tùy thuộc vào table name trong MySQL query

Share
  • 121 0 2

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>';

}
Avatar Trần Xuân Thắng @tranxuanthang
Aug 10th, 2020 7:36 AM

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?

0
| Reply
Share
Avatar Dr Dokkan @dokkan7
Aug 10th, 2020 7:42 AM

@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,....

+1
| Reply
Share

2 ANSWERS


Answered Aug 10th, 2020 8:23 AM
Accepted
+2

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é.

Share
Avatar Dr Dokkan @dokkan7
Aug 10th, 2020 9:05 AM

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?

0
| Reply
Share
Avatar Trần Xuân Thắng @tranxuanthang
Aug 10th, 2020 9:09 AM

@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.

0
| Reply
Share
Avatar Dr Dokkan @dokkan7
Aug 10th, 2020 10:21 AM

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ả!

+1
| Reply
Share
Answered Aug 10th, 2020 7:47 AM
+3

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?

Share
Avatar Trần Xuân Thắng @tranxuanthang
Aug 10th, 2020 8:31 AM

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.

0
| Reply
Share
Avatar Dr Dokkan @dokkan7
Aug 10th, 2020 9:05 AM

Đú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.

+1
| Reply
Share
Viblo
Let's register a Viblo Account to get more interesting posts.