通行证结果一个查询到另一个查询,然后合并这两个查询的结果

问题描述:

我有以下查询:通行证结果一个查询到另一个查询,然后合并这两个查询的结果

SELECT name as String 
    , COUNT(*) Total 
    , SUM(product = 1) Product 
      FROM String 
       WHERE language = 1 
      GROUP 
       BY name 
      ORDER 
       BY total desc 
      LIMIT 10 

此查询的目的是根据其在String发生报告字符串的TOP-10表格,加上报告它们在特定产品中的出现(id = 1)。

我想另一列添加到结果,这将统计每个字符串在另一个字符串中出现的次数。为此,我有一个表格Copy,它被全文索引索引。

我的问题是要弄清楚如何从结果传递String列的值到这个查询:

SELECT COUNT(name) as inAll 
    FROM Copy c 
     WHERE MATCH(c.name) AGAINST (/*String*/) 

是否有可能只是通过一个SQL查询来实现这个结果?

Before:     After: 

String Total Product  String Total Product inAll 
+-----+-----+------+  +-----+-----+-------+-----+ 
|blah | 52 | 12 |  |blah | 52 | 12 | 96 | 
|bleh | 23 | 14 |  |bleh | 23 | 14 | 56 | 
|bloh | 14 | 11 |  |bloh | 14 | 11 | 34 | 
+-----+-----+------+  +-----+-----+-------+-----+ 

谢谢。

编辑

我的架构:

CREATE TABLE Language (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(30) NOT NULL, 
    `code` VARCHAR(10) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci; 

CREATE TABLE Product (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `name` VARCHAR(100) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB CHARSET=utf8 COLLATE utf8_unicode_ci; 

CREATE TABLE String (
    `id` INT NOT NULL AUTO_INCREMENT, 
    `label` VARCHAR(200), 
    `name` TEXT(500) NOT NULL, 
    `language` INT NOT NULL, 
    `product` INT NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci; 

CREATE TABLE Copy (
    `id` INT NOT NULL, 
    `name` TEXT(500) NOT NULL, 
    PRIMARY KEY (`id`), 
    FULLTEXT(name) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE utf8_unicode_ci; 

另外INSERTDELETEUPDATE触发器。

+0

MySQL不允许使用内部子查询'AGAINST'所以你目前的做法肯定是要返工。 –

+0

'String'和'Copy'表之间的关系是什么? –

+0

由于旧的MySQL版本,我不能在InnoDB表上使用全文索引,所以复制表只是String表(id和名称列)的副本。对于不需要在全文索引中进行搜索的所有查询,我都使用String表。 – akasummer

您可以尝试加入StringCopy表:

SELECT COUNT(*) AS inAll, t.String AS String, t.Total AS Total, t.Product AS Product 
FROM Copy c 
INNER JOIN 
(
    SELECT name AS String, COUNT(*) Total, SUM(product = 1) Product 
    FROM String 
    WHERE language = 1 
    GROUP BY name 
    ORDER BY COUNT(*) desc 
    LIMIT 10 
) t 
ON c.name = t.name 
+0

我收到错误“操作数应包含1列(S)” – akasummer

+0

@akasummer我更新我的查询,它应该运行没有错误没有。 –

+0

是的,它正在工作。在使用此查询时,我可以以某种方式获取额外的列吗?或者我应该改变我的方法,就像你在评论中写的一样? – akasummer