1

恐怕我在 SQL 方面并没有什么大的动摇,所以我对此有问题并不感到惊讶,但如果你能帮助我让它工作(甚至不必是一个查询),我会很感激。试图在 Python 中使用 MySQLdb 分析一些 Twitter 数据,我正在运行:

for u_id in list:
"
select e.user_id
from table_entities e
inner join table_tweets t on e.id = t.id
where e.type='mention' and t.user_id=%s
group by e.type having count('hashtag') < 3
"
%
(u_id)

(python 语法稍微伪造以不显示不重要的东西)

现在,“group by”语句之前的所有内容都可以正常工作。我能够提取给定推文中提到的 user_ids(id 是 table_tweets 的 PK,而 table_entities 中每个提及、主题标签或 URL 都有另一行)匹配我循环的当前位置。

但是——而且我认为我没有正确地格式化它—— group by 语句没有做任何事情。我的意思是排除所有属于推文(ids)的user_ids,这些user_ids 在table_entity 中有3 个或更多条目,type=hashtag。我可以说它不会按原样工作,因为它实际上并不引用 id 列,而是我尝试过的任何方式(例如,通过尝试使其成为 join 子句的一部分)引发语法错误。

建议表示赞赏!

4

2 回答 2

0

这并没有真正做到你想要的。

select e.user_id
from table_entities e
inner join table_tweets t on e.id = t.id
where e.type='mention' and t.user_id=%s
group by e.type having count('hashtag') < 3
  • Select And group by 子句没有达到您的预期。通过放入e.user_idSELECT 子句而不是 GROUP BY MySQL 将为每个 e.type 选择一个任意的 user_id。
  • Having count('literalString')相当于Having COUNT(*) 您可以通过将 Count('hashtag') 移动到 select 子句自己看到这一点。

这是这些点的现场演示

结果是您的查询将仅在用户提及少于 3 次时才记录。

有很多方法可以完成你正在尝试的我选择 IN (你也可以使用 Exists 或 INNER JOIN 到子查询)

SELECT e.user_id 
FROM   table_entities e 
       INNER JOIN table_tweets t 
               ON e.id = t.id 
WHERE  e.type = 'mentions' 
       AND t.user_id =% s 
       AND e.user_ID  IN (SELECT e.user_id 
                             FROM   table_entities e 
                                    INNER JOIN table_tweets t 
                                            ON e.id = t.id 
                             WHERE  e.type = 'hashtag' 
                                    AND t.user_id =% s 
                             GROUP  BY e.user_id 
                             HAVING Count(*) >= 3) 

子选择查找 table_enties 中具有少于 3 条记录且 e.type 为“hashtag”的所有用户 ID 以及匹配的用户% s

'提及'和用户ID的主要选择过滤器。这使您可以选择一个 e.type 并根据另一个 e.type 的计数进行过滤。

于 2012-06-12T21:29:24.690 回答
0

我认为您错误地解析了我的帖子的一部分(我的错,因为它有点混乱)—— user_id 列仅在 type='mention' 时填充。我试图通过id列进行限制。也就是说,多亏了您的帮助,我才能让它工作!

select e.user_id
from table_entities e
inner join table_tweets t on e.id = t.id
where e.type='mention' and
e.id in
(select e.id
from table_entities e
where e.type='hashtag' group by e.id having count(*) < 3)

我决定将它移到 for u_id in list 循环的上方,因为查询现在需要一段时间才能运行,但我可以在这里很好地处理列表输出。谢谢!

于 2012-06-13T14:31:36.603 回答