0

表 (market_items) 的列(关键字)有关键字,每个关键字用逗号分隔。我正在使用此查询来获取关键字;

$cid = intval($cid);
$query = $db->query("
    SELECT keywords
    FROM ".TABLE_PREFIX."market_items
    WHERE cid = '{$cid}'
    GROUP BY keywords
    ORDER BY dateline DESC
");
$cat_tags = '';
while ($t = $db->fetch_array($query))
{
    $keywords = trim($t['keywords']);
    $keys = explode(",",$keywords);
    foreach ($keys AS $key)
    {
        $cat_tags .= '<span class="small_buttons_class"><a href="market.php?action=tag_items&keywords='.$key.'">'.$key.'</a></span> ';
    }
}

它可以很好地获取关键字,但它会显示类似的关键字,如下所示:

keyword1 keyword2 keyword1 keyword3 keyword4 keyword5 keyword3

“注意上面的关键字编号”

如何删除相似的关键字并像这样显示?例如

keyword1 keyword2 keyword3 keyword4 keyword5

为了清楚起见,在“关键字”列中,关键字的存储方式如下:

keyword2, keyword4, keyword3,keyword1

请帮忙!

4

5 回答 5

3

您遇到了以逗号分隔的字符串存储列表的已知困难之一:确保列表的唯一性或列表中的排序顺序。

请参阅我对在数据库列中存储分隔列表真的那么糟糕吗?对于这种方法的更多陷阱。

要在 SQL 中解决这个问题,您应该不将关键字列表存储为字符串,而是将每行一个关键字存储在第二个表中。

CREATE TABLE market_items_keywords (
  cid INT,
  keyword VARCHAR(20),
  PRIMARY KEY (cid, keyword)
);

此表中的主键被定义为每个 cid 可以有多个关键字,但对于给定的 cid,每个关键字仅出现一次,并且按字母顺序排列。

通过以这种方式存储关键字,您可以获得许多其他好处。

  • 与使用 LIKE 或正则表达式相比,您可以索引该keyword列以更有效地查找哪些 cid 具有给定关键字。
  • 您可以报告哪些关键字最受欢迎。
  • 您可以轻松获得整个项目中使用的不同关键字的列表。
  • 等等

回复您的评论:

您仍然可以使用一个查询来获取关键字,但可以确保该列表是唯一的并且是预先排序的:

$query = $db->query("
    SELECT keyword
    FROM ".TABLE_PREFIX."market_items_keywords
    WHERE cid = '{$cid}'
");

如果您需要它们按日期线排序:

$query = $db->query("
    SELECT k.keyword
    FROM ".TABLE_PREFIX."market_items_keywords AS k
    JOIN ".TABLE_PREFIX."market_items AS i USING (cid)
    WHERE k.cid = '{$cid}'
    ORDER BY i.dateline DESC
");

这样做意味着您不必explode() 关键字列表,也不必在while 循环中使用foreach 循环。只需获取行。

于 2013-11-11T15:11:09.377 回答
1
while ($t = $db->fetch_array($query))
{
    $keywords = trim($t['keywords']);
    $keys = explode(",",$keywords);
    foreach ($keys AS $key)
    {
        $tags[$key] = $key;        
    }
}
foreach ($tags as $tag) {
    $cat_tags .= '<span class="small_buttons_class"><a href="market.php?action=tag_items&keywords='.$tag.'">'.$tag.'</a></span> ';
}
于 2013-11-11T15:07:03.937 回答
1

试试这个;

$cid = intval($cid);
$query = $db->query("
    SELECT keywords
    FROM ".TABLE_PREFIX."market_items
    WHERE cid = '{$cid}'
    ORDER BY dateline DESC
");
$cat_tags = '';
while ($t = $db->fetch_array($query))
{
    $keywords = trim($t['keywords']);
    $keys = explode(",",$keywords);
    $keys = array_unique($keys);
    foreach ($keys AS $key)
    {
        $key = trim($key);
        $key_collect[$key] = $key;
    }
}

foreach ($key_collect as $k)
{
    $cat_tags .= '<span class="small_buttons_class"><a href="market.php?action=tag_items&keywords='.$k.'">'.$k.'</a></span> ';
}
于 2013-11-11T15:13:00.020 回答
0

SELECT DISTINCT... {以及您的其余查询}

在我看来,您不需要“分组”

于 2013-11-11T15:06:25.873 回答
0

参见波特算法。几年前,我为在搜索引擎上工作的西班牙语做了一个实现。英文实现更简单。你可以从我的代码PHP Stemmer开始。这会根据语法规则从单词中删除语法后缀。

于 2013-11-11T15:07:25.763 回答