• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:このMysql文の結果をこうしたい…)

Mysql文の結果を特定のタグで絞り込みたい方法

このQ&Aのポイント
  • PHPとMysqlを使用して、特定のタグで結果を絞り込む方法について質問です。
  • tagsテーブルから「うどん」と「そば」のタグに関連する結果を抽出するためのMysql文を作成したいです。
  • 回答いただけると助かります。

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

仕様の詰め次第ですね 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

auau5656
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • root139
  • ベストアンサー率60% (488/809)
回答No.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
auau5656
質問者

お礼

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

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • PHP/MySQL レコードの件数の取得COUNT

    ホームページを作っています。 レコードを検索したりカテゴリ別に絞り込んだりすることもできるようにしています。 レコードを閲覧しやすくするために、「前へ[0][1][2]次へ」のようなものをつけようとおもっています。 ところが、それをするためにはレコードの全ての数を取得しなければいけません。 全てのレコードを取得してそれからPHPの関数で件数を取得する方法もありますが、処理としてはスマートじゃないと思い、COUNT関数を使うべきなのかなと思いました。 なので、それで組んでみたんですけれど、カテゴリ別で絞り込むときに値が1にしかならないのです。 以下がソースです。 ※#musicNumに件数が入ります。 $textFilterの例「あつい」 $tags_forWhereの例「pop,dance」 $musicNum = mysql_query("SELECT COUNT(*) as cnt FROM contents_tags bt, mymusic b, tags t WHERE (b.number LIKE '%{$textFilter}%' OR b.title LIKE '%{$textFilter}%' OR b.text LIKE '%{$textFilter}%' ) AND bt.TAG_ID = t.ID AND (t.TAG IN ($tags_forWhere)) AND b.number = bt.CONTENT_ID GROUP BY b.number ORDER BY number DESC"); $musicNum = mysql_fetch_assoc($musicNum); $musicNum = $musicNum['cnt']; タグ機能はToxi法を使っています。 どこがおかしいのかご教授願いします。

    • 締切済み
    • PHP
  • 以下の式の後の部分のMySQLのSQL文の間違いを指摘してください

     $sql = 'select sql_calc_found_rows * from man '.  'where income>500000 or looks like %10% '.  'or left(looks,5)=77777 '.  'order by id desc limit 100'; どうしても、これでエラッテしまいますが、真中二行の  'where income>500000 or looks like %10% '.  'or left(looks,5)=77777 '. を除くとエラーになりませんので、真中に行が原因だと思いますがよく分りません. それとincomeはint型、looksはvarchar型です.

    • ベストアンサー
    • MySQL
  • mysql内データ検索結果の表示順について

    mysql内のデータを条件検索する時、検索結果の表示順を指定します。 新着順(id降順)で指定する場合のエラーについてアドバイスをいただけないでしょうか。 例えば、DB内データを降順で全件表示する場合は、 $query = "SELECT * FROM テーブル名 ORDER BY id DESC"; とすることでできると思います。 そこで、条件検索で結果表示をする場合は、上記の通りにしてもエラーが発生します。これについてのコードは以下のような感じです。 $query = "SELECT * FROM テーブル名 ORDER BY id DESC"; $where = array(); if (isset($_GET['area'])and($_GET['area'] !== '')) { $where[] = sprintf("(area='%s')", mysql_real_escape_string($_GET['area'])); } if (count($where) <> 0) { $query .= ' where ' . implode(' and ', $where); } これは、ORDER BY id DESCを書く位置が悪いのでしょうか? order by句は$query = select ~~~のあとに付けるという認識だったのですが、場合によって間違いとなるということなのでしょうか。 アドバイスをいただければ幸いです。

    • 締切済み
    • PHP
  • mySQLの内部結合について

    現在mySQLを使って、SQL文の勉強をしているのですがわからないことがあり、質問させていただきました。 テーブル同士をINNER JOINして結果を取得して、これに対してさらに別の処理(Whereなど)を行いたいのですが、うまくやり方がわかりません。 具体的にSQL文でいうとこんな感じです(ただしエラーが出て動きません)。 SELECT cmaster.comic_id,tags,title FROM mysql.comic_tag as ctag INNER JOIN mysql.comicmaster as cmaster ON ctag.comic_id = cmaster.comic_id AND WHERE tags = 'aa' この処理でやりたいことを説明するとcomic_tagとcomicmasterを結合して、その結果に対してさらにWhereでデータを絞るということしています。 このような場合はどのように処理をしたらいいんでしょうか?またjoinした後のデータを、既存のテーブルのように扱いたいのですが、なにか方法はないのでしょうか?

    • ベストアンサー
    • MySQL
  • 【SELECT文】

    baseテーブル winテーブル 041110_1   041110_1 041110_2   041110_2 041110_3   041110_3 041211_1 041211_2 041211_3 上記のようなテーブルがあり、表示させたいことは それぞれを前から7つめまでの文字をグループ化し、 winテーブルにあるものは表示させず、baseテーブルにあるもののみを表示させたいのですが、下記のSQLではうまくいきません。 どのようにしたら、うまくいくのか教えてください。 表示させたい形 041211 select substr(b.id,0,7) as id from base as b, win as w where 1=1 and substr(w.id,0,7) <> substr(b.id,0,7) group by substr(b.id,0,7) order by substr(b.id,0,7) desc;

  • MySQL insert文に関するエラーについて

    ○質問の主旨 MySQLのデータベースにテーブルを作ってinsert文で データを追加しようとするとシンタックスエラーが出ます。 SQL文が間違っているのかと思いGoogle検索や本で調べたりしましたが、 なぜ文法エラーが発生するのか分かりません。 エラーと対処方法をご存知の方がいらっしゃいましたらご教示願います。 ○質問の補足 // usersテーブル create table users ( id int not null auto_increment primary key, created datetime not null, modified datetime not null, username varchar(255), password varchar(40) ); desc users; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int(11) | NO | PRI | NULL | auto_increment | | created | datetime | NO | | NULL | | | modified | datetime | NO | | NULL | | | username | varchar(255) | YES | | NULL | | | password | varchar(40) | YES | | NULL | | +----------+--------------+------+-----+---------+----------------+ insert into users (created, modified, username, password) values (now(), now(), 'test1', 'test1'), (now(), now(), 'test2', 'test2') ); ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ')' at line 3

    • ベストアンサー
    • MySQL
  • SQL文作成のお願い

    前提として下記のようなテーブルがあります。 テーブル名:test フィールド: 1)id: varchar, not null 2)name: varchar 3)date: timestamp with time zone, not null このテーブルに下記のようなレコードがあります。 '00001', 'A', '2005-01-01 00:00:00' '00001', 'B', '2005-07-01 00:00:00' '00001', 'C', '2005-11-01 00:00:00' '00002', 'X', '2005-01-20 00:00:00' '00002', 'Y', '2005-07-20 00:00:00' '00002', 'Z', '2005-11-20 00:00:00' ■今やりたいこと このテーブルからidごとにdateフィールド値が最近のレコードを取得したい。 ■やってみたこと 下記SQLを発行しました。 >select id, max(date) from test group by id order by id 結果==> 00001 2005-11-01 00:00:00 00002 2005-11-20 00:00:00 実際はnameフィールドの値も取得したいのですが、group by句を使うとフィールド指定ができませんでした。 ■だめだったSQL select id, name, max(date) from test group by id order by id どのようにSQLを書けばよろしいでしょうか?

  • MySQLで複数のSELECT文を1文にまとめたい

    以下のようなテーブル table1 があります。 ******************* table1 ******************* Name, Kyouka, Score, ID ******************* 山田, 国語, 92, 10001 鈴木, 国語, 71, 10002 田中, 国語, 89, 10003 山田, 数学, 65, 10004 鈴木, 数学, 69, 10005 杉田, 英語, 96, 10006 山田, 英語, 63, 10007 田中, 英語, 76, 10008 ... ******************* カラムIDはPRIMARYを指定しています。 カラムScoreはインデックスを作成しています。 このテーブルで、「IDと教科」を指定したときに、以下の2つのデータを得たいと思っています。 (1) IDに対応する名前と、その教科中の順位 (2) その教科のレコード数 具体例としては、例えば「ID=10001、教科=国語」を指定したときに、「山田、3人中1位」というような情報が得たいです。 (「ID=10001、教科=英語」のようなおかしな組み合わせは指定しないようになっています。) (1) は、以下のようにして名前と順位を得る事が出来ました。 SELECT Name, (SELECT COUNT(*) + 1 FROM table1 b WHERE b.Score > a.Score and Kyouka='国語') AS rank FROM table1 a WHERE ID='10001' ORDER BY Score DESC; (2)は、以下のようにして特定の教科のレコード数を得る事が出来ました。 SELECT COUNT(*) FROM table1 WHERE Kyouka='国語'; しかし、実際にはレコード数が大量にあり、頻繁にこの検索を実行する予定なので、負荷が心配です。 出来るだけサーバーの負荷を減らすために、1回のSELECT文の実行で(1)と(2)をどちらも実現できるような方法はないでしょうか。 また、このテーブルでインデックスを作成しているのはIDとScoreのみですが、より負荷を減らすにはKyoukaにもインデックスを作成した方が良いでしょうか。 何卒、よろしくお願いいたします。

    • ベストアンサー
    • MySQL
  • MYSQLチューニング初心者です。

    MYSQLチューニング初心者です。 MYSQLでEXPLAINでチューニングをしている際以下の壁にぶち当たって打開方法がないか模索しております。 テーブル構造はダミーですがたとえばa1,a2,a3というテーブル下記記載 SELECT * from a1 left join a2 on a1.id = a2.id left join a3 on a3.id = a1.mailbox_id \G a1.id: INT 主キー a1.mailbox_id: INT INDEX a1.title: varchar(50) a1.body: text a1.created_at: datetime a2.id: INT 主キー a2.mail_address: varchar(50) INDEX a3.id: INT 主キー a3.priority: INT a3.mail_box_name: varchar(50) 上記テーブル構造にて(EXPLAIN SELECT a1.id as id,a1.title,a1.body,a1.created_at,a2.mail_address,a3.mail_box_name FROM a1 left join a2 on a1.id = a2.id left join a3 on a3.id = a1.mailbox_id WHERE a2.mail_address = 'hogehoge@test.jp' order by created_at DESC;)を行うと、 Using temporary; Using filesort;が必ず出てきて対処方法に詰まっています。 order句のcreated_atをINDEXにすればよいのかな?と思いつけてみたのですが、a1.idのプライマリキーが優先され、結局同じ症状が出ます。 マルチインデックスでa1.id,created_atを付加し、FORCE INDEXをしたときはUsing temporary; Using filesortは消えますが、ExplainのrefがNULLになってしまいます。 方向性としてはtemporaryを使わない、indexでのsortを可能にする方法です。 まとまっていない文章で申し訳ございません。どうぞご教授のほどよろしくお願いします。 >>データ量としてはa1・a2は50万レコード a3は10件ほどです。 >>mysql Ver 14.14 Distrib 5.1.40, for redhat-linux-gnu (i686) using readline 5.1

  • SELECT文で片方のテーブルを優先したい

    以下の3つのテーブルから、下記のような結果を得たいです。 table1:PK=id id(int), count(int) ------------------- 1, 11 2, 12 3, 13 5, 15 table2:PK=id ------------------- id(int), count(int) 1, 21 2, 22 4, 24 tableID:PK=id id(int) ------------------- 1 2 3 4 5 6 得たい結果 tableIDのすべてのIDに対して、 table2に見つかればtable2のID、 table2に見つからずtable1に見つかればtable1のID、 両方になければnull id, count ---------- 1, 21 2, 22 3, 13 4, 24 5, 15 6, null よろしくお願いいたします。