我正在編寫另一個實踐的博客引擎,使用SQLite和Perl Dancer框架。RYO博客引擎 - 顯示幾個職位的標籤
的表是這樣的:
CREATE TABLE posts (
p_id INTEGER PRIMARY KEY,
p_url VARCHAR(255),
p_title VARCHAR(255),
p_text TEXT,
p_date DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE tags (
t_id INTEGER PRIMARY KEY,
t_tag VARCHAR(255),
t_url VARCHAR(255)
);
CREATE TABLE tags_posts_junction (
tp_tag INTEGER NOT NULL,
tp_post INTEGER NOT NULL,
FOREIGN KEY(tp_tag) REFERENCES tags.t_id,
FOREIGN KEY(tp_post) REFERENCES tags.p_id
);
所有像WordPress的(或計算器)的大傢伙可以顯示標籤右邊的主頁上,回答每個問題之後,我想實現這一點。問題是我該怎麼做。
到目前爲止,帖子存儲在數據庫中,當我需要渲染顯示最新20篇帖子的頁面時,我將散列引用(fetchall_hashref
從DBI
)傳遞到模板。那麼如何在那裏添加標籤?當然我可以做類似
my $dbh = database->prepare('SELECT * FROM posts ORDER BY p_date DESC
LIMIT 20 OFFSET 0');
$dbh->execute;
my $posts = $dbh->fetchall_hashref('p_date');
foreach my $key (keys $post) {
my $dbh = database->prepare('SELECT * FROM tags WHERE t_id IN (
SELECT tp_tag FROM tags_posts_junction WHERE tp_post = ?)');
$dbh->execute($post->{"$key"}->{"p_id"});
my $tags = $dbh->fetchall_hashref(t_id);
$post->{"$key"}->{"$tag_hash"} = $tags;
};
但這很醜,每頁有20多個查詢,是不是太多了?我認爲應該有更好的辦法。
所以問題是如何獲得標籤20個職位最不重複的方式?
該查詢會給我一個頁面上存在的所有標籤的數組,不是嗎?我擔心加入會給我carthesian產品,我不想要。 – user1526661 2012-07-15 15:38:28
的確,JOIN工作得很好,你的代碼示例非常有用。非常感謝,這個問題的查詢就像'SELECT p_date,t_url,t_name FROM posts JOIN tags_posts_junction ON p_id = tp_post JOIN tags ON t_id = tp_tag WHERE p_id IN(1,2,3,4);' – user1526661 2012-07-16 10:38:23