1

アクティブなフォーラムの合計結果をワイルドカードでグループ化するのに問題があります。

最終的には、類似した名前を持つすべての結果をグループ化し、個別の行に合計する必要があります。

表: フォーラム

コラム: ゲーム、投稿

現在のクエリ:

SELECT game, sum(posts) FROM forums WHERE posts>1 AND game like
'%rift%' OR game like '%swiftsure%' GROUP BY name

現在の結果:

ゲーム の投稿

リフト (PVP デファイアント): ブライアクリフ 3406

リフトガイド 100

リフトリーダーシップ 1541

リフトレイド討論 1336

リフトレイドのリーダー 533

リフト:クレリック 85

リフト:メイジ 87

リフト: プライベート411

リフト: PVE リーダーシップ 113

リフト:ローグ 56

リフト:ウォリアー29

スター・ウォーズ旧共和国 PvP - Swiftsure 7

SWTOR Swiftsure リーダーシップ 0

SWTOR: Swiftsure プライベート 7

望ましい結果は次のようになります。

ゲーム | ゲーム | 投稿

リフト | 7697

スイフトシュア | 14

私は確かにすべての助けに感謝します!

4

4 に答える 4

3

一般的なグループ化を探しているので、列として CASE/WHEN を実行します...

SELECT case when game like '%rift%'      then 'Rift   '
            when game like '%swiftsure%' then 'Swiftsure'
       end as GroupName,
       count(*) as  PostCount
   from
      forums
   where
         game like '%rift%' 
      OR game like '%swiftsure%' 
   GROUP BY
      GroupName
于 2012-04-30T16:58:54.213 に答える
2

これを試してください:http://www.sqlfiddle.com/#!2/f6be7/4

select x.Name, COUNT(p.Name)
from
(
  SELECT 'JOHN' AS NAME
  UNION
  SELECT 'PAUL'  
  ) as x
LEFT JOIN Person p ON p.Name LIKE CONCAT('%',x.NAME, '%')
GROUP BY x.Name

サンプルデータ:

create table person
(
  name varchar(100)
  );


insert into person values
('JOHN LENNON'),
('WINSTON JOHN LENNON'),
('MICHAEL JOHN FOX'),
('PAUL McCartney'),
('SEAN PAUL DATA'),
('GREAT PAUL OF FIRE'),
('ST PAUL OF X');

出力:

NAME    COUNT(P.NAME)
JOHN    3
PAUL    4

GEORGE を数えたい場合は、UNION に追加するだけです。

select x.Name, COUNT(p.Name)
from
(
  SELECT 'JOHN' AS NAME
  UNION
  SELECT 'PAUL'  
  UNION
  SELECT 'GEORGE'
  ) as x
LEFT JOIN Person p ON p.Name LIKE CONCAT('%',x.NAME, '%')
GROUP BY x.Name

出力:

NAME    COUNT(P.NAME)
GEORGE  0
JOHN    3
PAUL    4

残念ながら、MySQL には unnest 機能がありません。Postgresql を使用すると、物事はより簡単になります: http://www.sqlfiddle.com/#!1/87c74/5

select x.Name, count(p.Name)
from 
unnest(array['John','Paul','George']) as x(Name)
left join Person p ON p.Name ilike concat('%',x.Name, '%')
group by x.Name

サーバー側言語のコンマ区切り文字列を Postgresql に直接使用することもできます。そのコンマ区切り文字列を中括弧で囲むだけです: http://www.sqlfiddle.com/#!1/87c74/17

select x.Name, count(p.Name)
from 
unnest('{John,Paul,George}'::text[]) as x(Name)
left join Person p ON p.Name ilike concat('%',x.Name, '%')
group by x.Name

これはPostgresqlでも機能し、値リストはクエリで直接使用できます(一方、MySQLでは、値リストはDDLでのみ使用できます):http://www.sqlfiddle.com/#!1/87c74/9

select x.Name, count(p.Name)
from 
(values('John'),('Paul'),('George')) as x(Name)
left join Person p ON p.Name ilike concat('%',x.Name, '%')
group by x.Name

FROM 句の値リストは Microsoft Sql Server でも機能します: http://www.sqlfiddle.com/#!3/87c74/3

于 2012-04-30T17:10:43.737 に答える
0

私はおそらく一緒に行きます:

  INSERT INTO working_table (keyword, connection)
  VALUES ('rift', connection_id())('swiftsure', connection_id());

  SELECT w.keyword, count(*)
  FROM forums f
  INNER JOIN working_table w
  ON f.game LIKE CONCAT('%', w.keyword, '%')
  WHERE w.connection=connection_id()
  AND forms.posts>1
  GROUP BY w.keyword;

  DELETE FROM working_table
  WHERE connection=connection_id();

2本足の犬のように走ります。実際、これを行う場合は、適切な検索エンジン スキーマを使用します。

于 2012-04-30T16:40:45.710 に答える