MySQL5を使用している場合、テーブルから条件を元に値を取得する方法は?

このQ&Aのポイント
  • MySQL5を使用している場合、テーブルから条件を元に値を取得する方法を教えてください。
  • 現在のテーブルの構成と条件を元に、ユーザーごとにアイテムの個数をカウントする方法を教えてください。
  • テーブルから条件を元に値を取得する際、GROUP BY句をどのように使えば良いのかわかりません。ご教授ください。
回答を見る
  • ベストアンサー

難しすぎて何と質問すればいいかわかりません。。

mysql5を使用しております。 下記のようなテーブルがあるのですが、そのテーブルから、条件を元に値を取得したいのですが、どうすればいいかわからず質問させて頂きました。。 わかる方がいましたらヒントだけでも構いませんので、どうかよろしくお願いいたします! ============================= ▼現在のテーブルの構成▼ ============================= P_id  user_id  item 1     1    下駄 2     1    下駄 3     1    スニーカー 4     1    スニーカー 5     1    長靴 6     2    スニーカー 7     2    下駄 8     2    長靴 9     2    長靴 10     3   下駄 11     3    スニーカー 12     3    スニーカー 13     3    スニーカー 14     3   下駄 15     4   下駄 16     4   下駄 17     4   長靴 18     5   長靴 19     5   長靴 20     5   長靴 ============================= ▼条件▼ ============================= ・各ユーザー(user_id)がアイテム(item)をそれぞれ何個持ってるかカウントしたい。 ============================= ▼取得後の理想▼ ============================= user_id  item     count 1     下駄     2 1     スニーカー  2 1     長靴     1 2     スニーカー  1 2     下駄     1 2     長靴     2 3     スニーカー  3 3     下駄     2 4     下駄     2 4     長靴     1 5     長靴     3 ※itemは実際は別テーブルと紐付けられておりitem_id(int型)が入っております。 以上になります。 GROUP BY句を使うのだろうとは分かっているのですが、単純に使っても「user_id」もしくは「item」が各idでまとまってしまい(これも説明がうまく出来ないのですが・・)どのように使えばいいかわかりません。 よろしくお願いいたします!

  • MySQL
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

Oracleユーザなので多少異なるけど。 select user_id, item, count(*) from <現在のテーブルとやら> group by user_id, item order by user_id, item ;

icon_fanta
質問者

お礼

>>bin-chan様 せっかくご教授頂いたのに、ご返信遅れて申し訳ありません・・・。 インフルエンザにかかってしまいました・・・ ということで、bin-chan様からのものを参考にやってみたところ、Mysqlでもバッチリでした! すごく難しく考えていました・・・。 でも、「group by」を複数指定する方法自体初めて見たので、とても参考になりました! 本当に有難うございました!

関連するQ&A

  • MySQLでJOINを使った検索について

    MySQLについて質問があります。 下記のような2テーブルがあります。 ----------------------------- ・item 商品情報を格納。 ・usersitem ユーザーが所有している商品の個数を格納。 ----------------------------- この2つのテーブルから2つのリストを取り出したいと考えています。 【A】特定のユーザーが複数所有している商品の一覧 【B】特定のユーザーが所有していない商品の一覧 【A】は出来たのですが、【B】のSQL文がわかりません。 どうかご教授いただけませんでしょうか。 ■テーブルを作成したSQL ----------------------------- CREATE TABLE `test`.`item` ( `itemid` SERIAL NOT NULL DEFAULT NULL UNIQUE, `itemname` VARCHAR( 256 ) ); CREATE TABLE `test`.`usersitem` ( `id` SERIAL NOT NULL DEFAULT NULL UNIQUE, `userid` INT, `itemid` INT, `count` INT ); ----------------------------- ■【A】を実現したSQL 条件:userid「1」のユーザーがcount「2」以上の一覧。 ----------------------------- SELECT * FROM `item` LEFT JOIN `usersitem` ON (`item`.`itemid` = `usersitem`.`itemid`) WHERE `usersitem`.`userid` = 1 AND `usersitem`.`count` >= 2 ----------------------------- ■【B】を実現しようとしたが違っていたSQL 条件:userid「1」のユーザーがcount「0」以下、または登録されていない一覧。 ----------------------------- SELECT * FROM `item` LEFT JOIN `usersitem` ON (`item`.`itemid` = `usersitem`.`itemid`) WHERE ( `usersitem`.`userid` = 1 AND `usersitem`.`count` <= 0 ) OR `usersitem`.`userid` != 1 ----------------------------- 結果: 個数情報が登録されていない商品が表示されない。 違うユーザーの情報が表示されてしまう。 使用しているのは MySQL 5.5.29です。 よろしくお願いいたします。

  • 一度に関連する他のテーブルの行も取得したい

    MySQLバージョン4.1.16を使用しています。 ちょっとPHPも絡んでくるのですが、こちらのジャンルでお願いします。 テーブル「items」はテーブル「users」のuser_idカラムを 外部キーとして持っています。ここで「users」テーブルの行を取得して、 その値(user_idのaaaaやbbbbなど)を利用して 「items」テーブルのそれぞれ対応する行を取得したいのですが、 $users = (usersテーブルの行を取得するSQL文); $index = 0; foreach ($users as $row) { $users[$index]['items'] = (user_idに対応したitemsテーブルの行を取得するSQL文); $index++; } print_r($users); /* Array (  [0] => Array   (    [user_id] => aaaa    [items] => Array     (      [0] => Array       (        [user_id] => aaaa        [item_name] => アイテム1       )      [1] => Array       (        [user_id] => aaaa        [item_name] => アイテム2       )     )   )  [1] => Array   (    [user_id] => bbbb    [items] => Array     (      [0] => Array       (        [user_id] => bbbb        [item_name] => アイテム3       )     )   ) ) */ と、このように2段階に分けてやれば取得できるのですが、 そうではなくてこれを一度に取得できるSQL文というかやり方はあるのでしょうか? $users = (usersテーブルの行を取得するSQL文);←この段階でそれぞれ対応してるitemsテーブルの行まで取得したい

  • SQL文作成についてお知恵をお貸しください

    ユーザーと商品のテーブル(省略)、 商品ジャンルテーブル、 genre id   name 1   家電 2   3万円台 3   テレビ 4   黒 5   SONY 6   三菱 商品とジャンルのリレーションテーブル、 item_genre item_id genre_id 1    1 1    2 1    3 2    1 2    3 2    4 2    6 ユーザーが希望する商品ジャンルのテーブル(ユーザーとジャンルのリレーションテーブル)、 user_genre user_id genre_id 1    1 1    3 2    1 2    3 2    4 3    1 3    3 3    4 3    5 以上があるとします。 この時に商品側から(商品IDを元に)、その商品を希望しているユーザーIDを取得する場合の SQL文の作成方法のご教示をお願いいたします。 上記のテーブルの例ですと、アイテム1から取得したいユーザーIDは1、アイテム2からは ユーザーID 1と2を取得できればOKです。 商品が持つジャンルIDが1,2,3に対してユーザーが希望するジャンルIDが1,3のように少ない 場合は対象にふくまれますが、商品が持つジャンルIDが1,3に対してユーザーが希望する ジャンルIDが1,3,4のように多くなる場合は対象に含めません。 色々と考えてみたのですが、頭がこんがらがってしまい迷宮に迷い込んでしまいました。 すみませんがお知恵をお貸しください。よろしくお願いします。 ※DBサーバーがMySQLのため、MySQLで実現できる方法だとありがたいです。

    • ベストアンサー
    • MySQL
  • 簡単に正規化したい

    プログラム素人です。 初心者なのでこんなテーブルを思いつくのですが、これってカラムをいちいち作らないといけないので後のメンテが大変な気がします CREATE TABLE hoge( id INT PRIMARY KEY, item1 VARCHAR(255), value1 INT, item2 VARCHAR(255), value2 INT, item3 VARCHAR(255), value3 INT ); こんな感じのテーブルにどんどんINSERTしていきたいのです CREATE TABLE hoge( id INT PRIMARY KEY, item VARCHAR(255), value INT ); 聞きたいこと MYSQL側 IDにPRIMARY KEYが付いているのですが2つ同じPRIMARY KEYはINSERTでききませんよね?どうすればいいでしょうか? perl側 IDごとにまとめて取得して配列に入れる方法はありますか? idが1のアイテムを全部取得して配列に入れる方法がわかりません(他にいい方法があったらお願いします) よろしくお願いします

    • ベストアンサー
    • MySQL
  • MySQL: 複数テーブルのcount

    複数テーブルの総行数(count値)を取得したいのですが、下記だとテーブルA,B,Cの結果が バラバラに出力されてしまいます。 【入力条件】 mysql> select COUNT(*) AS 列ID from テーブルA      union all      select COUNT(*) AS 列ID from テーブルB      union all      select COUNT(*) AS 列ID from テーブルC; 【出力結果】       +-----+       | 列_ID |       +-----+       |  1  | ←テーブルAの合計:行数       |  2  | ←テーブルBの合計:行数       |  3  | ←テーブルCの合計:行数       +-----+ 総行数:6を一発で取得するには、どのようにしたらよろしいのでしょうか? 大変恐縮ですが、ご教授よろしくお願いいたいます。 <<MySQLのverは5,5です。

    • ベストアンサー
    • MySQL
  • mysqlのインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL
  • 複数検索時の条件分岐について

    環境:php5、mysql5 条件検索はできるのですが検索状況の違いによる条件分岐について どなたがアドバイスをお願いします。 $sql内でWHERE以降を「 if ~ else ~ 」などを使って変更するか WHILE以降を変更する気がするのですがやり方がよくわかりません。 よろしくお願いします。 以下設定 テーブル  :tbl_item [int] フィールド1:item_id [int] フィールド2:cate_id [int] ←他テーブル(名前に変換) フィールド3:item_name [varchar] フィールド4:price [decimal] フィールド5:stock_id [int]   ←他テーブル 条件1:cate_id(プルダウン)を検索条件に加えている時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.cate_id = '" . mysql_real_escape_string( $_GET['cate_id'] ) . "' AND tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); 条件2:cate_id(プルダウン)を検索条件に加えていない時 $sql = "SELECT tbl_item.*, tbl_stock.item_stock FROM tbl_item LEFT JOIN tbl_stock ON tbl_item.item_id = tbl_stock.item_id WHERE tbl_item.item_name LIKE '%" . mysql_real_escape_string( $_GET['item_name'] ) . "%' AND price BETWEEN '" . mysql_real_escape_string( $_GET['price_s'] ) . "' AND '" . mysql_real_escape_string( $_GET['price_e'] ) . "' ORDER BY tbl_item.item_id desk LIMIT ${_GET['page']}, ${_GET['rows']} "; $result = mysql_query( $sql ) ; $num_rows = mysql_num_rows( $result ); ・ ・ アイテム数 <?= $num_rows ?> 種類 ・ ・ <? WHILE ( $item = mysql_fetch_array( $result ) ) { ?> ・ ・ ・ <? $n ++; } ?>

    • ベストアンサー
    • PHP
  • 2つの関連するテーブルで指定した値を条件に取得したい

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) name varchar(30) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl2s」 +------+-------+ |  id  | name | +------+-------+ |  1  | sato  | +------+-------+ |  2  | suzuki | +------+-------+ |  3  | tanaka | +------+-------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 1   | +------+-------+------+ 「tbl1s」テーブルの行を「tbl2s」テーブルのnameを検索条件にして取得したいのですが どのように記述すれば良いのでしょうか? 例えば「sato」を条件にした場合は、 テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  3  | +------+ を取得したいです。

    • ベストアンサー
    • MySQL
  • 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 よろしくお願いいたします。

  • select文で特定のIDを抽出しupdate

    こんにちは、はじめまして。phpとmysqlで以下のような処理をしたいのですが どうすればよいか分からず、ご質問させていただきました。 前提として、下記のような「アイテム」、「ユーザー」、「画像」を管理する3つのtableが あり、「画像」テーブルでは、どのアイテムに(item_id)どのユーザーが(user_id)その 画像を投稿したかを管理するtableが存在します。 そこで、画像が投稿された際に、アイテムtableの、「item_image」のカラムに item_idと、user_idがマッチする【image_id】をupdateしたいのですが ※item_idと、user_idの値については保持しており、データがあります。  また、item_idと、user_idの組み合わせはユニークで、画像table内に1つしかありません。 image_idをどのように抽出すればいいか分からずご相談させていただきました。 ※ちなみに、item_id,user_id,image_idは、PRIMARY KEYです。 環境など補足が必要でしたらご連絡いただけますと幸いです。 どうかよろしくお願いいたします。 ■アイテムtable item_id |item_name | item_image・・・ ------------------------ 1    |aaa     |4 ■ユーザーtable user_id | user_name ------------------------ 3    | aaa ■画像table image_id | item_id | user_id ------------------------ 4     | 1 | 3