2013-02-20 61 views
0

我有这个疑问:MySQL查询 - 获得列值“大于......”

$score = 10; 
SELECT timecode, count(tag) as n_tags, tag 
FROM dados 
WHERE dados.tag = 'tag1' 
AND dados.filename = 'file.mp4' 
AND (timecode >= '-5' AND timecode <= '15') 
AND (timecode = '$score') 
GROUP BY timecode 
ORDER BY count(tag) DESC 

不过,我想改变6行:

AND (timecode = '$score' AND n_tags > 3) 

,但它不似乎是正确的方式,它不起作用。

任何想法?

+0

你们都检查相等'timecode ='$ score''并检查它是否在'时间码> = -5和时间码<= 15'的范围内。该范围内是否有$ score? (为什么你需要的范围呢?) – 2013-02-20 14:32:24

+0

是的!这是正确的... – zppinto 2013-02-20 14:33:24

+1

在进行数据库查询之前,测试$ score是否在-5到15之间,如果是则执行查询 - 然后您可以消除AND(timecode> ='-5'AND timecode <= '15 ') – 2013-02-20 14:33:57

回答

2

从WHERE子句中删除该行并放入HAVING子句。 HAVING子句将查看聚合结果。哪里没有。

SELECT timecode, count(tag) as n_tags, tag 
FROM dados 
WHERE dados.tag = 'tag1' 
AND dados.filename = 'file.mp4' 
AND (timecode >= '-5' AND timecode <= '15') 
AND (timecode = '$score') 
GROUP BY timecode 
HAVING count(tag) > 3 
ORDER BY count(tag) DESC 

此行是多余的,可以被丢弃:AND(时间码> = 5'和时间码< = '15')

SELECT timecode, count(tag) as n_tags, tag 
FROM dados 
WHERE dados.tag = 'tag1' 
AND dados.filename = 'file.mp4' 
AND (timecode = '$score') 
GROUP BY timecode 
HAVING count(tag) > 3 
ORDER BY count(tag) DESC 
+2

有什么区别? – 2013-02-20 14:33:06

+0

HAVING子句将查看聚合结果。哪里没有。 – Tom 2013-02-20 14:34:05

+0

@Tom问题是您的答案需要包含这些信息。没有解释的解决方案并不是一个真正的答案 - 这只是一个解决方案。 – 2013-02-20 14:36:07

2

你不能在WHERE使用聚合领域条款。 count()结果仅在考虑了所有适用的行后才可用。但是where过滤是在每个单独的行被解析时完成的。 Cliche声明,但你试图在他们孵化之前计数你的鸡。

这样的事情必须用HAVING子句完成,该子句基本上与where完全相同,但是在最终结果发送回客户端之前应用。所以...

SELECT ..., count(tag) as n_tags 
... 
WHERE (timecode = '$score') 

HAVING (n_tags > 3)