MySqlとPHPを使用してポーリングシステムにタグ機能を追加しています。ユーザーはタグをクリックして、それぞれのタグを持つすべての投票(別名提案)を一覧表示します。リンクは「/propositions/ tagsed/baseball」のようになります。
mod_rewriteを使用して、「baseball」タグを$tagという変数に割り当てます。
RewriteRule ^propositions/tagged/(.*)$ /propositions/index.php?tag=$1 [L]
ポーリングに関連付けられているタグのタグ名は返されません。どうすればそれらの名前を取得できますか?
以下のクエリは機能しますが、ポーリングに関連付けられたタグのタグ名は返されません。どうすればそれらの名前を取得できますか?また、より効率的に行うことができますか。もう1つ、投票データとともにタグを保存する方がよいでしょうか。しばらく前に、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}