【问题标题】:Retrieve data based on conditions in MySQL根据 MySQL 中的条件检索数据
【发布时间】:2014-04-16 07:20:53
【问题描述】:

我在 MySQL 中有一个名为 hash 的表,它有 2 个字段,primary_keyhashValue。我使用以下代码将数据输入其中:

insert into hash values (1,'car dog play ball morning dark night')
insert into hash values (2,'car dog play ball people morning dark night sydney love')

现在,我需要执行以下操作。

  1. 输入单词列表。
  2. 输入一个百分比值。
  3. 比较每行输入的单词,并获取这些单词在行中可用的百分比。
  4. 获取高于百分比值的数据行。

例如:

假设我输入以下单词集:sydney love people track

假设我输入的百分比为:20

现在,primary_key = 2 的行包含 10 个单词,其中 3 个(悉尼爱人)在输入的单词列表中。这 3 个单词意味着第二行中的 30%(10 个单词中的 3 个单词)。由于输入的百分比是 20 并且 30 高于该百分比,因此我需要检索该行。就这样,如果还有其他20行以上,我也需要获取。

如何在 MySQL 中做这种事情?请注意我的数据库知识低于平均水平(我知道 Java 中的插入、删除、更新和 JDBC)。

我以前用 Java 做过这个。我逐行读取文件并做了同样的事情。这需要太多时间。现在我要用数据库替换文件,但我不能在这里应用相同的方法,因为原始数据库会非常大,并且通过 Java 读取每一行都会变得一团糟。仅供参考,将有数百万条记录。

【问题讨论】:

  • 你100%确定你需要在数据库中做吗?因为用编程语言做起来很简单。
  • @TomaszKowalczyk:是的。我以前用Java做过这个。我读了一个文件并做了同样的事情。这需要太多时间。而且,我不能在这里应用相同的方法,因为原始数据库会非常大,读取每一行都会很混乱。

标签: java mysql sql database select


【解决方案1】:

如果您可以更改数据结构,我建议您这样做:

INSERT INTO hash([key],[word])
VALUES
(1,'car'),
(1,'dog'),
(1,'play'),
(1,'morning'),
(1,'night'),
(2,'car'),
(2,'dog'),
(2,'play'),
(2,'ball'),
(2,'people'),
(2,'morning'),
(2,'dark'),
(2,'night'),
(2,'sydney'),
(2,'love')

然后你可以这样查询:

select key,FullCount,SubCount,(100.0/FullCount)*SubCount as 'Percent' from (
select * from (select key,COUNT(*) FullCount from hash group by key) a
left join 
(select key as subkey,COUNT(*) SubCount from hash where word in ('sydney','love','people','track') group by key) b
on a.key=b.subkey) c where (100.0/FullCount)*SubCount>20

(注意:未在 MySQL 上测试!)

添加一些索引就完成了。

【讨论】:

  • 是什么意思?在您的情况下,我必须删除主键对吗?你建议的结构是什么?
  • 去掉主键即可。在这种情况下,关键字段不能是唯一的。
  • 好的。谢谢。但在实际场景中,正如我上面提到的,会有很多数据。这意味着,以这种方式,“数十亿”的记录。那么,这行得通吗?
  • 数十亿?就 10^9 而言???我认为“这项工作是否有效”的答案取决于您可以使用的硬件。大型 MySQL 集群?可能!你的笔记本电脑?不!
  • 没有。我们正在使用单独的服务器
【解决方案2】:

我会改变数据库结构,引入多对多关系哈希word

只需创建 3 个表 hashwordshash_words。您拥有的每一个都可以存储在 3 个表中。

使用hash_words 表要容易得多。您的所有计算都只是在 SQL 级别上使用的聚合函数的结果。 (SUM/COUNT/AVG)

【讨论】:

  • 嗨。 hash 表包含什么,words 表包含什么,hash_words 包含什么?无论如何,正如我之前提到的,“用户”是要插入单词和百分比列表的人。表格包含预先插入的单词,以便我们进行比较。
  • words 有 id、word 字段。 hash 实际上只有 id。 hash_words 有一对 id hash_id 和 word_id
  • 对不起,我不清楚。你能解释一下吗?你能好心地展示一下数据库结构吗?如果您不介意,也许可以创建这些并显示结构?
猜你喜欢
  • 2014-06-19
  • 2022-01-16
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-24
  • 2020-12-30
相关资源
最近更新 更多