我正在使用 MySql 和 PHP 向轮询系统添加标签功能。用户将单击一个标签以列出所有带有相应标签的民意调查(AKA 命题)。链接看起来像这样,“/propositions/tagged/baseball”。
我使用 mod_rewrite 将“棒球”标签分配给名为 $tag 的变量。
RewriteRule ^propositions/tagged/(.*)$ /propositions/index.php?tag=$1 [L]
它不返回与投票关联的标签的标签名称。我怎么会得到这些名字?
下面的查询有效,但它不返回与投票关联的标签的标签名称。我怎么会得到这些名字?另外,是否可以更有效地完成它。还有一件事,将标签与投票数据一起存储会更好吗?不久前,我看到 SO 这样做喜欢将标签包含在带有问题的表格列中。不知道他们是否仍然这样做或曾经这样做过,但不久前在某个地方看到或读过它。
非常感谢!
==================================================== =====
pb_prop (
id int(11) NOT NULL auto_increment,
active tinyint(1) NOT NULL default '1',
submit_by int(11) NOT NULL,
total_votes int(11) NOT NULL default '0',
removed tinyint(1) NOT NULL default '0',
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Described below as ".PROP_TABLE." p
==================================================== =====
pb_prop_tags (
id int(11) NOT NULL auto_increment,
prop_id int(11) NOT NULL,
tag_id int(11) NOT NULL,
PRIMARY KEY (id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Described below as ".PROP_TAGS_TABLE." pt
==================================================== =====
pb_tags (
tag_id int(11) NOT NULL auto_increment,
tag_name varchar(64) NOT NULL,
PRIMARY KEY (tag_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Described below as ".TAGS_TABLE." t
==================================================== =====
pb_prop_answers (
id int(11) NOT NULL auto_increment,
prop_id int(11) NOT NULL,
num_votes int(11) NOT NULL default '0',
PRIMARY KEY (id),
KEY poll_id (prop_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Described below as ".PROP_ANSWERS_TABLE." a
==================================================== =====
下面的工作 SQL ...可以改进吗?自从发布原始 SQL 以来,我在 select 中添加了特定的列...去掉了一些通配符。此外,在 WHERE 中添加了更多内容以更好地过滤结果。
后显示原始 SQL。
SELECT
u.username, u.userid,
p.*,
pt.prop_id,
pt.tag_id,
t.*,
(
SELECT
SUM(num_votes)
FROM
".PROP_ANSWERS_TABLE." a
WHERE
a.prop_id = p.id
) AS total_votes,
(
SELECT
count(*)
FROM
".PROP_ANSWERS_TABLE." a
WHERE
a.prop_id = p.id
) AS total_answers
FROM
".PROP_TABLE." p
INNER JOIN
".TAGS_TABLE." t
ON
t.tag_name LIKE '%".$tag."%'
INNER JOIN
".PROP_TAGS_TABLE." pt
ON
pt.tag_id = t.tag_id
LEFT JOIN
".USERS_TABLE." u
ON
u.userid = p.submit_by
WHERE
pt.tag_id = t.tag_id
AND
pt.prop_id = p.id
AND
p.removed = 0
AND
p.active = 1
AND
t.tag_id = pt.tag_id
ORDER BY
{$sort} {$dir}
原贴SQL:
SELECT
u.username, u.userid,
p.*,
pt.*,
(
SELECT
SUM(num_votes)
FROM
".PROP_ANSWERS_TABLE." a
WHERE
a.prop_id = p.id
) AS total_votes,
(
SELECT
count(*)
FROM
".PROP_ANSWERS_TABLE." a
WHERE
a.prop_id = p.id
) AS total_answers
FROM
".PROP_TABLE." p
INNER JOIN
".PROP_TAGS_TABLE." pt
ON
pt.tag_id = p.id
INNER JOIN
".TAGS_TABLE." t
ON
t.tag_name LIKE '%".$tag."%'
LEFT JOIN
".USERS_TABLE." u
ON
u.userid = p.submit_by
WHERE
p.removed = 0
AND
p.active = 1
AND
t.tag_id = pt.tag_id
ORDER BY
{$sort} {$dir}