【问题标题】:MYSQL question - get unique valueMYSQL 问题 - 获取唯一值
【发布时间】:2010-11-02 15:46:34
【问题描述】:

假设我在 MySQL 中有这两个变量

SET data1 = "1,2,3,apple,4,5";
SET data2 = "apple,orange,5";

如何获得这两个变量上出现的项目数?

【问题讨论】:

  • 我不确定我是否正确解释了您的问题,但听起来您想要的是两个变量的交集(它们共同的值)。对吗?
  • 不确定 SQL 是否是字符串操作的最佳语言。这有一种反模式的味道......
  • 我正在尝试在数据库级别实现算法。我正在比较的功能之一是两个项目之间共享的标签数量。我不想使用临时表或直接访问表来比较这些标签,所以我想改用字符串比较,但不确定是否可能。
  • 标签不应该在一个单独的表中,每行一个标签吗? SQL(任何风格)对于这些类型的操作来说真的很棒,但是对于内联字符串操作来说是一个巨大的 PITA。
  • MySQL 不包含任何分隔分隔字符串的功能,因此您将在此实现中遇到很多问题。你为什么不想直接访问标签表呢,这样会容易很多。

标签: mysql database function logic


【解决方案1】:

如果您确实需要在 MySQL 端执行此操作,您可以创建存储过程(或存储函数),其中:

  • 创建临时表(因为MySQL的存储例程不能处理数组,所以必须使用临时表作为数组)
  • 创建WHILE 循环以使用LOCATE()LEFT()RIGHT() 函数解析您的字符串 (MySQL Manual: String functions ) 在临时表中插入每个值
  • 从此临时表中执行所需的选择(包括交叉点等)

但是这个解决方案真的远非优雅。将标签存储在单独的表格中(如上所述,每行一个标签)更可取。

【讨论】:

  • 谢谢,我决定使用不同的方法。
【解决方案2】:

没有办法分解列表并计算项目。用您的母语操作值来爆炸它的唯一方法:

php 中的示例:

$values = mysql_result();
echo count(explode(",", $values));

另一种方法是将所有标签放在一个单独的表中,然后将它们连接到一个数据透视表中,然后您可以执行以下操作:

select 
    count(*) 
from 
    items 
join 
    pivot on pivot.item_id = items.id 
join 
    tags on pivot.tag_id = tags.id 
where 
    item.id = {itemid}

【讨论】:

  • 是的 - 我可以在 PHP 上做到这一点,但我希望能够根据我在数据库层上使用的算法对数据进行排序,所以我需要实现完全相同的算法在 PHP + MySQL 级别上。知道你通常是怎么做的吗?基本上,我作为用户会有一个针对不同事物的兼容性编号,我已经完成了 PHP 级别的评分,但是当涉及到 MySQL 时,我有点卡住了
  • 检查我的编辑。基本上你需要把它们放在一个单独的表中
猜你喜欢
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
  • 2014-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多