我是SQL的新手。我有2个MySQL表。下面是它们的结构。

Key_Hash

CREATE TABLE `key_hash` (
 `primary_key` int(11) NOT NULL,
 `hash` text NOT NULL,
 `totalNumberOfWords` int(11) NOT NULL,
 PRIMARY KEY (`primary_key`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


-

Key_Word

CREATE TABLE `key_word` (
 `primary_key` bigint(20) NOT NULL AUTO_INCREMENT,
 `indexVal` int(11) NOT NULL,
 `hashed_word` char(3) NOT NULL,
 PRIMARY KEY (`primary_key`),
 KEY `hashed_word` (`hashed_word`,`indexVal`)
) ENGINE=InnoDB AUTO_INCREMENT=28570982 DEFAULT CHARSET=latin1


现在,下面是我的查询

SELECT `indexVal`, COUNT(`indexVal`) FROM `key_word` WHERE `hashed_word` IN ('001','01v') GROUP BY `indexVal` LIMIT 100;


当您运行上面的查询时,您将得到如下输出



这里要注意的重要一点是,indexVal表中的key_wordprimary_key表中key_hash中的数据集相同(我认为它可以是外键吗?)。换句话说,primary_key表中的key_hash数据在indexVal表中显示为key_word。但是请注意indexVal可以在表内出现任意次,因为它不是key_word中的主键。

好的,这不是我确切需要的查询。我需要计算每个唯一的indexVal在上述搜索中出现的次数,然后将其除以key_hash.totalNumberOfWords中的适当值。

我在下面提供一些示例。

想象一下,我运行了上面的查询,现在生成了结果。它说


indexVal 0在搜索中出现10次
indexVal 1在搜索中出现20次
indexVal 300在搜索中出现20,000次


现在请记住key_hash.primary_key = key_word.indexVal。首先,我搜索与key_hash.primary_key类似的key_word.indexVal并获取关联的key_hash.numberOfWords。然后,将上述查询中出现的count()与此key_hash.numberOfWords相除,然后将总答案​​乘以100(以百分比形式获得值)。以下是我尝试过的查询,但有错误。

  SELECT `indexVal`,COUNT(`indexVal`), (COUNT(`indexVal`) / (select `numberOfWords` from `key_hash` where `primary_key`=`key_word.indexVal`)*100) FROM `key_word` WHERE `hashed_word` IN ('001','01v') GROUP BY `indexVal` LIMIT 100;


我该怎么做?

编辑

这就是key_hash表的样子



这就是key_word表的样子

最佳答案

您可以使用JOIN代替子查询

SELECT w.indexVal
     , COUNT(w.indexVal)
     , COUNT(w.indexVal) / MAX(h.numberOfWords) * 100
FROM   key_word w
       INNER JOIN key_hash h ON h.primary_key = w.indexVal
WHERE  w.hashed_word IN ('001','01v')
GROUP BY indexVal
LIMIT 100

关于mysql - 从2个表中调用数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23327702/

10-09 07:23