重複データを一つずつ表示したい!MySQLを使ってデータベース操作する方法を教えてください。

このQ&Aのポイント
  • MySQLを使用して重複したデータを個別に表示する方法を教えてください。添付画像のように、attachment_nameは画像ですが、item_idに重複があります。どれでも構いませんので、各データを一つずつ表示したいです。
  • 質問者は、MySQLの命令文を試行錯誤していますが、うまくいっていません。getfeatured01という関数でデータを取得していますが、結合などがうまくいっていないようです。提供されたMySQLコマンドを基に、質問者にMySQLを教える方法についてアドバイスしてください。
  • 質問者は、MySQLの基本的な知識が不足しているため、理解するのが難しいと感じています。そのため、具体的なMySQLの操作方法や指導を求めています。MySQLの指導をお願いします。
回答を見る
  • ベストアンサー

重複データを一つづつ表示したいです。

mysqlの命令文等いろいろと試行錯誤しています。 添付画像のように、attachment_nameは画像なのですが、item_idが重複されていますので どれでもよろしいですので、各一つづつ表示させたいです。 mysql文はいろいろと結合していますが、下記の通りです。 function getfeatured01($sales_type='rental'){ $db = Database::instance(); //$rsfeat = $db->query("select item_id from items"); $sql = "SELECT *, attachment.name as attachment_name, ldk_type.id as ldkid, ldk_type.name as ldkname, caution_money_num.name as cautionmoneynum_name, reward_num.name as rewardnum_name FROM items INNER JOIN ldk_type ON ldk_type.id = items.ldk_type INNER JOIN caution_money_num ON caution_money_num.id = items.caution_money_num INNER JOIN reward_num ON reward_num.id = items.reward_num INNER JOIN attachment ON attachment.item_id = items.item_id WHERE sales_type = 'rental' and status = '1' order by price asc LIMIT 0,20 "; $rsfeat = $db->query($sql); return $rsfeat; } いろいろと検索してみますが、基本がなっていないせいか、理解ができません。 今回MySQLをご指導いただきたく質問いたしました。 申し訳ございませんが、ご指導のほど、宜しくお願いいたします。

  • MySQL
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
回答No.2

こんにちは。 MySQLはちょっと特殊で・・・、 特定のカラムで「GROUP BY」した時、残りのカラムは適当に選ばれて出力されます。 一般的にはエラーになるはずですが、MySQLはエラーになりません・・・。 なので、要件的に「attachment_name」がどれでもいいのなら、SQLの一番外側で、「item_id」だけで「GROUP BY」してみてください。

hara-guu
質問者

お礼

ありがとうございます。 GROUP BYという命令というのは、すごいですね。 やはり、本だけの知識では難しいですね。 MYSQL文にGROUP BY命令を追加することによって、 綺麗に整理されました。 ありがとうございました。 感謝感激です!!

その他の回答 (1)

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

なにがやりたいのか解らないのでとりあえず・・ item_idを複数あったときに一つだけ表示したいなら とりあえずgroup by item_idするのが妥当でしょう。 ただし、item_idによってデータのユニークが保証されていないわけですから その他の項目はどれを優先して表示したいのか仕様をきめこむ必要があります。 そもそもattachmentテーブルではアイテムのidをどうやってユニークに 管理しているのでしょうか? それととりあえず 基本ができていないと自覚しているなら SELECT *というワイルドカードをつかうのはやめた方がいいです。 あれ単なるデバッグなどにちょろっとだけ使うものです。 どんなに項目が多くても列記してください。

hara-guu
質問者

お礼

ありがとうございます。 そうですね、どの項目を表示したいかという考え方が浅い感じがします。 http://neosystem1.net/kotobuki-test/ このホームページの注目の物件のカスタマイズをしていまして、お客様から 画像を入れてほしいという要望でしたので、試行錯誤しながらしていました。 それで、画像は表示されるようになっていますが、画像が保管されている分出力されてしまい 悩んでいます。 SELSCT文の*はデバッグ用なのですね、列記して入力します。 貴重なご意見ありがとうございました。

関連するQ&A

  • 2つのSQL文で結果に差違が発生する

    私の知識ではお手上げのため、ご教授願いたいのですが、 下記のようなテーブルが仮にあったとして、レコードがそれぞれいくつか入っています。 【itemsテーブル】   id・・・・・連番   cat_id・・・category.id   price ・・・価格   max_num ・・セット数   date・・・・発売日 【categioryテーブル】   id・・・・・連番   cat_name・・カテゴリ名 【orderテーブル】   id・・・・・連番   item_id ・・items.id   paid_price・支払価格 以下の2つのSQL文を実行させた場合、「total_price」の値に違いは発生しますか? 【SQL文 A】----------------------------- SELECT items.cat_id, `category`.`cat_name`, SUM(`items`.`price` * `items`.`max_num`) AS `total_price`, SUM(IF(`order`.`paid_price` > 0, `order`.`paid_price`, 0)) AS `total_paid`, SUM(IF(`order`.`paid_price` = 0 , `items`.`price`, 0)) AS `not_payment` FROM `items` INNER JOIN `category` ON (`items`.`cat_id` = `category`.`id`) INNER JOIN `order` ON (`items`.`id` = `order`.`item_id`) WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511 GROUP BY `items`.`cat_id` ORDER BY `items`.`cat_id` ASC ------------------------------------ 【SQL文 B】----------------------------- SELECT items.cat_id, `category`.`cat_name`, SUM(`items`.`price` * `items`.`max_num`) AS `total_price` FROM `items` INNER JOIN `category` ON (`items`.`cat_id` = `category`.`id`) WHERE AND DATE_FORMAT(`items`.`date`, '%Y%m') = 201511 GROUP BY `items`.`cat_id` ORDER BY `items`.`cat_id` ASC ------------------------------------ こちらで上記と同じようなSQL文を実行すると、Bで出てほしい値がAでは出てこないのです。 Aの場合は「WHERE DATE_FORMAT(`items`.`date`, '%Y%m') = 201511」が抽出条件として実行されていないような感じです。 すべてのレコードの「SUM(`items`.`price` * `items`.`max_num`) AS `total_price`」が計算されています。 Bだけで実行すればちゃんとほしい値が返ってきます。 何か間違っていますか?

    • ベストアンサー
    • MySQL
  • sqlの積について

    以下、2つのテーブルがあるとします。 cake (テーブル) id, name, price (カラム) 1, チョコ, 300 2, マッチャ, 250 3, イチゴ, 400 4, チーズ, 200 sold (テーブル) name, num, total_sales (カラム) チョコ, 3, " " マッチャ, 4, " " イチゴ, 1, " " チーズ, 5, " " (total_salesは空欄という設定です) この2つのテーブルにおいて、inner joinを使い、nameをカギとしてcakeとsoldを結びます。 (select * from cake inner join sold on cake.name = sold.name;) そのあと、各商品においてpriceとnumの積を計算し、total_salesに結果をupdateするにはどうすればいいのでしょうか… update = sold set sold.total_sales = cake.price* sold.num from cake inner join sold on cake.name = sold.name; や UPDATE S SET total_sales = S.num * C.price FROM cake as C inner join sold as S ON C.name = S.name などいろいろ試してみましたが、どうしてもできません…

  • テーブル結合について

    SQL Serverで、メイン、サブ1、サブ2、サブ3、サブ4というテーブルがあり、以下のSQLを実行すると、メインにあるすべてのデータ(10列)が抽出されます。 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id しかし、上記のSQL文に追加して、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id INNER JOIN サブ4 ON メイン.name4=サブ4.id とすると、メイン内の10列のうち、2列しか抽出されません。 サブ4を結合しても、一つ目のSQL文と同じ結果を抽出したかったのですが、どこがおかしいのでしょうか? SQL文がまずいのか、サブ4のテーブル内容のせいなのか、SQL Serverの設定がおかしいのか、さっぱり見当がつきません。 足りない情報がありましたら補足いたしますので、どうぞよろしくお願いします。

  • データーベースの結合について

    はじめまして。 先日異動で新しい職場につき、マイクロソフトアクセスを使用し始めたド初心者です。 早速ですが教えてください。 使用しているアクセスは2000です。 http://okweb.jp/kotaeru.php3?q=246849 ↑にて参考にさせていただきましたが、 SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id のようにテーブルを4つ結合したいのです。 現在、2つのテーブルを結合することはできましたが、 3つ以上のテーブルの結合ができずに困っています。 上記のようにやってみると 「構文エラー:演算子がありません」と表示されます。 .ASPという拡張子のものですがそれがいけないのでしょうか? (正式には SQL = "SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id" と、1行で書かないと認識しません SQL = "SELECT * FROM メイン INNER JOIN サブ1 ON メイン.name1=サブ1.id INNER JOIN サブ2 ON メイン.name2=サブ2.id INNER JOIN サブ3 ON メイン.name3=サブ3.id" とするとエラーになります。 ) 以前、勤めていた方の仕事を引き継いだのですが聞ける人もいないので途方にくれています。 質問自体がおかしいかもしれませんがどうぞ初心者にも理解できる回答をよろしくお願いします。

  • ランキング機能の実装

    group byを使って、詳細テーブルを集計してランキング表示するためのSElECT文を作成しています。購入数の多い順に商品を表示させるには、以下のSQL文をどのように修正すればいいですか? $sql = " SELECT details.item_id, details.price, details.amount SUM(details.price * details.amount) AS total, items.name FROM details JOIN items ON details.item_id = items.item_id GROUP BY details.item_id, details.price, details.amount, items.name ORDER BY amount ";

    • 締切済み
    • PHP
  • 複数JOINしているとCOUNTが正しく取得できな

    LAMP環境で開発をしています。 SQL文でCOUNTを求める際に、まとめて結果を求めようとして上手く行きません。 状況としては以下です。 テーブルdはidをkeyにa,b,c3つのテーブルとjoinしています。 id = 1の場合、テーブルa,b,cにマッチするレコードがそれぞれに4個、1個、0個あります。 ひとつひとつを SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count FROM d INNER JOIN a ON a.id = d.id WHERE d.id = 1 として結果を求めると4,1,0と出るのですが、まとめて SELECT COUNT(CASE WHEN a.name IS null THEN 1 ELSE null END) as a_count, COUNT(CASE WHEN b.name IS null THEN 1 ELSE null END) as b_count, COUNT(CASE WHEN c.name IS null THEN 1 ELSE null END) as c_count FROM d INNER JOIN a ON a.id = d.id INNER JOIN b ON b.id = d.id INNER JOIN c ON c.id = d.id WHERE d.id = 1 とすると28,5,0という値が返されます。 どのように書けば正しい4,1,0を得られるのでしょうか? よろしくお願いします。

    • ベストアンサー
    • MySQL
  • データがない場合のクエリの書き方

    いつもお世話になっております。 MySQLとPHPで開発をしております。 以下のような3つのテーブルがあります。 テーブル:Hp(キー:hid) |hid |name |・・・| +---------------------+ |1  |a_name|・・・| |2  |b_name|・・・| テーブル:items(キー:item_id) |item_id|item|alias|type|・・・| +----------------------------------+ |1   |aa |aaaaa|11 |・・・| |2   |bb |bbbbb|11 |・・・| |3   |cc |ccccc|11 |・・・| |4   |dd |ddddd|22 |・・・| |5   |ee |eeeee|22 |・・・| テーブル:check(キー:hid, item_id ) |hid|item_id|・・・| +-------------------+ |1 |1   |・・・| |1 |2   |・・・| |1 |3   |・・・| |2 |1   |・・・| |2 |3   |・・・| |2 |5   |・・・| check に登録されていない item_id を表示したいと考えているのですが データの取得方法がわかりません。 例えば hid=1 の場合、item_id=4 と item_id=5 を取得したいです。 下記クエリの場合、hid に関係なく取得できてしまいます。 select i.* from items i left join check c using(item_id) where i.type='11' and c.item_id is NULL order by i.item_id ASC どうやってクエリを書いたらよろしいでしょうか。 ご教示お願いいたします。 <環境> MySQL:4.1.20

    • ベストアンサー
    • PHP
  • サブクエリ内で INNER JOIN は

    グルーピング内で、あるカラムの最大値のレコードで絞り込む方法は、 以下のサイトで知ることができましたが。 http://www.yokablo.com/20120905717.html tb_score +-------+-------+-------+ | c_name | game | c_score | +-------+-------+-------+ | 山田 | 高飛び | 90 | +-------+-------+-------+ | 山田 | 徒競走 | 85 | +-------+-------+-------+ | 山田 | 玉入れ | 90 | +-------+-------+-------+ | 鈴木 | 徒競走 | 85 | +-------+-------+-------+ | 鈴木 | 騎馬戦 | 50 | +-------+-------+-------+ | 室伏 | 綱引き | 100 | +-------+-------+-------+ | 室伏 | 玉入れ | 10 | +-------+-------+-------+ SQL文: SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX(c_score) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING (c_name) WHERE c_score = MAXSCORE 私の場合、t_score の親テーブル名`t_company`と、 子テーブル`t_items`がありまして、 以下のようなことをやりたかったのですが、エラーとなります。 上記SQL をサブクエリにします。 select * from ( SELECT * FROM tb_score INNER JOIN ( SELECT c_name, MAX( c_score ) AS MAXSCORE FROM tb_score GROUP BY c_name ) AS TBDUMMY1 USING ( c_name ) INNER JOIN t_company ON t_company.c_name = tb_score.c_name WHERE c_score = MAXSCORE ) as T1 , t_items where T1.id_score = t_items.id_score 結果エラーメッセージは、 #1060 - Duplicate column name 'c_name' でした。 エラー箇所が、 GROUP BY c_name か、 USING ( c_name ) か、 INNER JOIN t_company ON t_company.c_name = tb_score.c_name なのか、分かりません。 SQL の規則としてやってはいけないことをやっていると想像してますが、 ご指摘・ご指導いただけると大変に助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • テーブルを結合

    テーブルの結合に関して質問します。 ネットなどでinner joinを使った複数のテーブル結合が参考として 書いてあったのですが(3つまで), 4つテーブルを結合する事は 出来るのでしょうか? A,B,CテーブルにはID,NAMEがあります。 DテーブルにはA,B,CテーブルのIDがあります。 参考サイトを見て3つのテーブルを結合するSQLが以下になります。 SELECT a.name, b.name, c.name FROM a INNER JOIN (b INNER JOIN c ON b.id = c.id) ON a.id = c.id よろしければアドバイスお願いします。

  • 結合で重複のエラーが出る

    mysql5.1.33を使用しています。 次のような構成で、 テーブル「tbl1s」 id int(11) テーブル「tbl2s」 id int(11) テーブル「tbl1s_tbl2s」 id int(11) tbl1_id int(11) tbl1sの外部キー tbl2_id int(11) tbl2sの外部キー テーブル「tbl2sbelongs」 id int(11) tbl2_id int(11) tbl2sの外部キー count int(11) テーブル「tbl1s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl2s」 +------+ |  id  | +------+ |  1  | +------+ |  2  | +------+ |  3  | +------+ テーブル「tbl1s_tbl2s」 +------+-------+-------+ |  id  | tbl1_id | tbl2_id | +------+-------+-------+ |  1  | 1    | 1   | +------+-------+------+ |  2  | 1    | 2   | +------+-------+------+ |  3  | 3    | 3   | +------+-------+------+ テーブル「tbl2sbelongs」 +------+-------+-------+ |  id  | tbl2_id | count | +------+-------+-------+ |  1  | 1    | 3   | +------+-------+------+ |  2  | 2    | 10  | +------+-------+------+ |  3  | 3    | 15  | +------+-------+------+ SELECT * FROM `tbl1s_tbl2s` AS `Tbl1sTbl2` INNER JOIN (SELECT *, sum(Tbl2sbelong.`count`) as sum FROM `tbl2s` AS `Tbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl2`.`id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `Tbl2`.`id` ) AS `SUB` ON (`Tbl1sTbl2`.`tbl2_id`=`SUB`.`id`) WHERE 1 = 1 GROUP BY `tbl1_id` を実行すると、 「SQL Error: 1060: Duplicate column name 'id' 」 というエラーが出てしまいます・・・ おそらくカラムのidが結合の中で重複しているという内容だと思うのですが、 3つもテーブルが絡んでくるとどれのidがというのが分からないのですが、 これは何が原因なのでしょうか? ちなみにサブクエリの SELECT *, sum(Tbl2sbelong.`count`) as sum FROM `tbl2s` AS `Tbl2` INNER JOIN `tbl2sbelongs` AS `Tbl2sbelong` ON (`Tbl2`.`id`=`Tbl2sbelong`.`tbl2_id`) WHERE 1 = 1 GROUP BY `Tbl2`.`id` この段階までは実行できます。 最終的には、「tbl2sbelongs」テーブルの「count」の値によって、「tbl1s」を降順に並べ替えたいと思っています。 この例だと テーブル「tbl1s」 +------+ |  id  | +------+ |  3  |count = tbl2_id「3」の15 = 15 +------+ |  1  |count = tbl2_id「1」の3 + tbl2_id「2」の10 = 13 +------+ |  2  |count = 0 +------+

    • ベストアンサー
    • MySQL