【问题标题】:Mysql array data manipulationMysql数组数据操作
【发布时间】:2011-04-06 04:43:22
【问题描述】:

我有一个带有tags 列的articles 表。列中的每一行都包含一个字符串,如下所示:

tag1, tag3, tag5, tag0 // separated via a comma

tag1 tag6 tag5 tag8 // separated via a space

请注意,“tag”后面的数字表示不同的单词。我需要比较 每个 行的重复项并返回一个单词被重复的次数,然后将其放入一个循环中,例如:

  • tag0(1次)
  • tag1(2 次)
  • tag3(1次)
  • tag6(1次)
  • tag8(1次)

如果你能帮助我,在 6 小时的尝试失败后,我会真诚地感谢你。我之前确实问过同样的问题,但过早地接受了答案。 Mysql Results and array manipulation

【问题讨论】:

  • 获取每个标签字段,将它们分解为1个大列表,然后按标签计数

标签: php mysql


【解决方案1】:

这就是非规范化数据库设计失败的原因——你失去了轻松进行关系查询的能力。鉴于与“外部”编程语言相比,SQL 数据库具有可怕的字符串操作工具,因此您需要将所有这些标记字符串吸出到 PHP 中并在那里进行解构/计数。

如果您的数据库已正确规范化,并使用单独的子表来链接标签文章,那么查询将是微不足道的

SELECT tag.name, count(articles_tags.article_id) AS cnt
FROM tags
LEFT JOIN article_tags ON tags.id = articles_tags.tag_id
GROUP BY tag.id
ORDER BY tag.name

现在你被困住了

SELECT id, tags from ARTICLES

$tag_count = array();
while($row = mysql_fetch_assoc($result)) {
   $tags = preg_split('/[ ,]/', $row['tags']);
   foreach($tags as $tag) {
       $tag_count[$tag]++;
   }
}
sort($tag_count);

【讨论】:

  • 当然,我完全同意。但我没有创建系统,我只是在使用那里的东西。如果我创建了它,那么我会完全按照您的描述进行操作。
  • 如果你在我身边,我会在你的脚下敬拜。早上七点,我可以睡觉了。非常感谢
猜你喜欢
  • 1970-01-01
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-02
相关资源
最近更新 更多