1

残念ながら、私は SQL があまり得意ではないので、これで問題が発生しても驚くことではありませんが、問題を解決するのを手伝っていただければ (1 つのクエリである必要はありません)、私は感謝します。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 ですが、言及、ハッシュタグ、または URL ごとに table_entities に別の行があります) ループの現在の位置に一致します。

しかし、私はそれをどこでも正しくフォーマットしているとは思いません.group byステートメントは何もしません。つまり、type=hashtag の table_entity に 3 つ以上のエントリを持つツイート (id) に属するすべての user_id を除外します。実際にはid列を参照していないため、そのままでは機能しないことがわかりますが、それを実行しようとした方法(たとえば、結合句の一部にしようとするなど)構文エラーをスローします。

アドバイスをいただければ幸いです。

4

2 に答える 2

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 に答える
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 句が期待どおりに機能していません。GROUP BY MySQL ではなく SELECT 句を入れることe.user_idで、e.type ごとに 1 つの任意の user_id が選択されます。
  • Having count('literalString')Having COUNT(*) Count('hashtag') を select 句に移動することで、これを自分で確認できるのと同じです。

これらのポイントのライブデモはこちら

その結果、クエリは、ユーザーのメンションが 3 つ未満の場合にのみ記録されます。

あなたがしようとしていることを達成する方法はたくさんあります。

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) 

サブセレクトは、e.type が「hashtag」であり、一致するユーザーを持つ table_enties に 3 未満のレコードを持つすべてのユーザー ID を検索します。% s

「メンション」とユーザー ID のメインの選択フィルター。これにより、1 つの e.type を選択し、別の e.type のカウントでフィルタリングできます。

于 2012-06-12T21:29:24.690 に答える