2015-02-24 225 views
-1

我得到一个错误的下面查询:如何在SELECT中使用COUNT别名?

SELECT 
    mt.tag_id, 
    count(mt.tag_id) as bcount, 
    bcount/t.count as rel, 
    t.count as t 
FROM 
    tags.media_tag as mt, 
    tags.tags as t 
WHERE 
    mt.media_id in (SELECT 
      mt.media_id 
     FROM 
      tags.media_tag as mt 
     WHERE 
      mt.tag_id = 'tag') 
GROUP BY mt.tag_id 
ORDER BY rel 
LIMIT 1000; 

错误:

Error Code: 1054. Unknown column 'bcount' in 'field list' 

我想再次使用计数的选择,因为它是一个相当昂贵的查询。我只能做count(mt.tag_id),但这似乎是难以忍受的缓慢。任何想法来优化或实现别名的别名?

表:

medias(示出于完整性考虑,不需要在查询)

+----+-------+-------+---------+ 
| id | attr1 | attr2 | attrEtc | 
+----+-------+-------+---------+ 
| 11 |  |  |   | 
| 22 |  |  |   | 
+----+-------+-------+---------+ 

media_tag

+----------+--------+ 
| media_id | tag_id | 
+----------+--------+ 
|  11 | tag | 
+----------+--------+ 

tags

+-----+-------+ 
| id | count | 
+-----+-------+ 
| tag |  1 | 
+-----+-------+ 

UPDATE:示例数据:http://sqlfiddle.com/#!2/b8085

预期的响应,其中目标标签,或在查询上述mt.tag_id = tagB

+--------+--------+--------+-----------------+ 
| tag_id | tcount | bcount | bcount/tcount | 
+--------+--------+--------+-----------------+ 
| tagB |  2 |  2 | 1    | 
| tagC |  2 |  1 | 0.5    | 
| tagA |  3 |  1 | 0.333   | 
+--------+--------+--------+-----------------+ 

bcount = TAG_ID和TAGB(目标)之间共享media_id的数目

+0

在给定的小提琴中,你的'mt.tag_id ='tag''是什么?来自您拥有的查询的价值?您的查询速度慢的原因之一是计算值上的“order by”子句,这使得查询在存在大量数据时真的很慢。 – 2015-02-24 08:31:31

+0

在更新中回答了这个问题只是'tagB' – Zaheer 2015-02-24 08:45:37

回答

1

这是我最终使用的查询。 @NoDisplayName接近但并非全部。这个SQL实际上在几秒钟内完成运行,并且比我原来的查询快得多。

SELECT 
    mt.tag_id, 
    COUNT(mt.tag_id)/t.count as rel, 
    COUNT(mt.tag_id) AS bcount, 
    t.count as tcount 
FROM 
    tags.media_tag AS mt 
     INNER JOIN 
    (SELECT 
     smt.media_id 
    FROM 
     tags.media_tag as smt 
    WHERE 
     tag_id = 'tag') meds ON mt.media_id = meds.media_id 
     INNER JOIN 
    tags.tags t ON t.id = mt.tag_id 
GROUP BY mt.tag_id 
ORDER BY rel; 
+1

很高兴帮助你 – 2015-02-25 07:34:00

2

而不是alias直接使用Count(mt.tag_id)

SELECT mt.tag_id, 
     Count(mt.tag_id) AS bcount, 
     Count(mt.tag_id)/t.count AS rel, 
     t.count   AS t 
FROM tags.media_tag AS mt, 
     tags.tags AS t 
WHERE mt.media_id IN (SELECT mt.media_id 
         FROM tags.media_tag AS mt 
         WHERE mt.tag_id = 'tag') 
GROUP BY mt.tag_id 
ORDER BY rel 
LIMIT 1000; 

更新:请尝试更改您的查询。你可以避开sub-querywhere条款,并使用正确的Inner Join

SELECT mt.tag_id, 
     Count(mt.tag_id)   AS bcount, 
     Count(mt.tag_id)/t.count AS rel, 
     t.count     AS t 
FROM tags.media_tag AS mt 
     INNER JOIN tags.tags AS t 
       ON mt.tag_id = t.id 
WHERE mt.tag_id = 'tag' 
GROUP BY mt.tag_id 
ORDER BY rel 
+0

MySQL会将它检测为相同的操作,查询速度非常慢。 – Zaheer 2015-02-24 07:55:57

+0

@Zaheer - 已更新检查。加入这两个表使用普通列 – 2015-02-24 07:58:45

+0

这似乎主要存在,但只返回1结果总是。这个想法是返回所有其他标签与目标标签的关系。 – Zaheer 2015-02-24 08:02:40

0

我觉得你在这里做什么错.... 纠正bcount数(mt.tag_id)

SELECT 
     mt.tag_id, 
     count(mt.tag_id) as bcount, 
     count(mt.tag_id)/t.count as rel, 
     t.count as t 
    FROM 
     tags.media_tag as mt, 
     tags.tags as t 
    WHERE 
     mt.media_id in (SELECT 
       mt.media_id 
      FROM 
       tags.media_tag as mt 
      WHERE 
       mt.tag_id = 'tag') 
    GROUP BY mt.tag_id 
    ORDER BY rel 
    LIMIT 1000;