如何在 SELECT 中使用 COUNT 别名?
How to use COUNT alias in SELECT?
我收到以下查询的错误消息:
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'
我想再次使用 select 中的计数,因为它是一个非常昂贵的查询。我可以做 count(mt.tag_id)
但这似乎慢得令人无法忍受。有什么优化或实现别名的想法吗?
表格:
medias
(为了完整性而显示,查询中不需要)
+----+-------+-------+---------+
| id | attr1 | attr2 | attrEtc |
+----+-------+-------+---------+
| 11 | | | |
| 22 | | | |
+----+-------+-------+---------+
media_tag
+----------+--------+
| media_id | tag_id |
+----------+--------+
| 11 | tag |
+----------+--------+
tags
+-----+-------+
| id | count |
+-----+-------+
| tag | 1 |
+-----+-------+
更新:示例数据: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 的数量
而不是 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-query
in where
子句并使用正确的 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
我认为你在这里做错了....
将其更正为 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;
这是我最终使用的查询。 @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;
我收到以下查询的错误消息:
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'
我想再次使用 select 中的计数,因为它是一个非常昂贵的查询。我可以做 count(mt.tag_id)
但这似乎慢得令人无法忍受。有什么优化或实现别名的想法吗?
表格:
medias
(为了完整性而显示,查询中不需要)
+----+-------+-------+---------+
| id | attr1 | attr2 | attrEtc |
+----+-------+-------+---------+
| 11 | | | |
| 22 | | | |
+----+-------+-------+---------+
media_tag
+----------+--------+
| media_id | tag_id |
+----------+--------+
| 11 | tag |
+----------+--------+
tags
+-----+-------+
| id | count |
+-----+-------+
| tag | 1 |
+-----+-------+
更新:示例数据: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 的数量而不是 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-query
in where
子句并使用正确的 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
我认为你在这里做错了.... 将其更正为 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;
这是我最终使用的查询。 @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;