みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

このMysql文の結果をこうしたい…

こんにちわ。PHPとMysqlで色々やろうとしている者です…
すっごい初心者です。

こんな感じのテーブルがあって…

tagsテーブル
[int id(PK)(A_I)][varchar tag(index)][int u_id]

1、うどん、5
2、そば、5
3、うどん、2
4、ラーメン、2
5、そうめん、1
6、そば、3
....(つづく)

こんな文があります…

SELECT u_id,
count(CASE WHEN tag = "うどん" or tag = "そば" THEN 1 ELSE NULL END ) AS `agr`
FROM tags
GROUP BY u_id ORDER BY agr DESC

結果は

[u_id][agr]
5、2
8、2
4、1
3、0
....(つづく)

tagが「うどん」or「そば」のu_idを集計して多い順にソートするんですが
これの結果を「うどん」and「そば」の結果だけを出力したい(この場合agrの結果2のみ)

…要するにtagをandで検索したいという事です…
回答よろしければお願いします…

投稿日時 - 2013-08-07 20:46:08

QNo.8210235

困ってます

質問者が選んだベストアンサー

仕様の詰め次第ですね

tagとu_idの組み合わせがユニークかどうかでやり方が異なります
たとえばu_id=5の人が一度「そば」を登録した後にダブって「そば」を
登録できるかどうかということ

仮にuniqueを前提にすればこんな感じ

//元データ
create table tags(id int not null primary key auto_increment,tag varchar(30),u_id int,unique (tag,u_id));
insert into tags values(1,'うどん',5),(2,'そば',5),(3,'うどん',2),(4,'ラーメン',2),(5,'そうめん',1),(6,'そば',3);

//ユーザーごとにうどんorそばに合致する件数
SELECT u_id,
sum(tag in('うどん','そば')) as agr
FROM tags
GROUP BY u_id ORDER BY agr DESC

//うどんかつそばに合致するユーザー
SELECT u_id
FROM tags
GROUP BY u_id
having sum(tag in('うどん','そば'))=2

投稿日時 - 2013-08-08 16:01:22

お礼

回答有り難うございます。

投稿日時 - 2013-08-09 20:18:53

ANo.2

このQ&Aは役に立ちましたか?

3人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.1

HAVING句を使って「うどん」と「そば」がそれぞれ一回以上出現しているものだけを抽出すればよいです。

例) ------------------------------------
SELECT u_id,
count(CASE WHEN tag = "うどん" or tag = "そば" THEN 1 ELSE NULL END ) AS `agr`
FROM tags
GROUP BY u_id
HAVING
SUM(CASE WHEN tag = "うどん" THEN 1 ELSE 0 END) > 0 AND
SUM(CASE WHEN tag = "そば" THEN 1 ELSE 0 END) > 0
ORDER BY agr DESC
----------------------------------------

参考URL:http://codezine.jp/article/detail/652

投稿日時 - 2013-08-08 01:35:59

お礼

回答有り難うございます。

投稿日時 - 2013-08-09 20:18:37

あなたにオススメの質問