別テーブルの行数を利用してソートする方法

このQ&Aのポイント
  • MySQLバージョン4.1.16を使用しています。
  • テーブル「tbl1」とテーブル「tbl2」を結合し、テーブル「tbl2」の「msg」カラムの行数を利用してソートする方法を知りたいです。
  • 例えば、tbl2のuser_idがbbbbのmsg数の方が多い場合、tbl1をbbbb、aaaaの順に並べるようにしたいです。
回答を見る
  • ベストアンサー

別テーブルの行数を利用してソートしたい

MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」の「msg」カラムの行数を利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 以下の例だと、tbl2のuser_idがbbbbのmsg数の方が多いので descで並べるとtbl1はbbbb、aaaaの順になるようにしたいです。 テーブル「tbl1」 +----------+ | user_id   | +----------+ |  aaaa   | +----------+ |  bbbb   | +----------+ テーブル「tbl2」 +----------+---------+ |  user_id  |  msg  | +----------+---------+ |  bbbb   |  ああ  | +----------+---------+ |  aaaa   |  いい  | +----------+---------+ |  bbbb   |  うう   | +----------+---------+ SELECT * FROM tbl1 INNER JOIN tbl2 ON tbl1.user_id = tbl2.user_id ORDER BY (ここの部分が知りたいです、または全く違う文になるのでしょうか?) desc

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

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

  • ベストアンサー
  • nora1962
  • ベストアンサー率60% (431/717)
回答No.2

よく考えたらleft join のほうがいいですね。 SELECT tbl1.* FROM tbl1 LEFT JOIN ( SELECT tbl2.user_id,count(*) cnt FROM tbl2 GROUP BY tbl2.user_id) t2 ON tbl1.user_id = t2.user_id ORDER BY t2.cnt desc;

takagoo100
質問者

お礼

ご返答ありがとうございます。 その方法を試してみたのですが、 Error Number: 1054 Unknown column 'tbl2.user_id' in 'on clause' SELECT * FROM users LEFT JOIN (SELECT tbl2.user_id,count(*) cnt FROM tbl2 GROUP BY tbl2.user_id) t2 ON users.user_id = tbl2.user_id ORDER BY t2.cnt desc; というエラーが出てしまいます・・・(usersテーブルはtbl1と同じ構造です) ちゃんとtbl2テーブルには「user_id」と「msg」のカラムがあり 値も例のように入れてるのですが、どこが間違っているのでしょうか?

その他の回答 (2)

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.3

> SELECT * FROM users LEFT JOIN (SELECT tbl2.user_id,count(*) cnt > FROM tbl2 GROUP BY tbl2.user_id) t2 ON users.user_id = tbl2.user_id > ORDER BY t2.cnt desc; インラインビューに「t2」という別名をつけているのに、結合条件のON句 で「tbl2」を使っているからです。「tbl2」を「t2」に変えてください。

takagoo100
質問者

お礼

ご返答ありがとうございます。 なるほど、うっかりミスでした・・・すいません 試してみましたが希望する結果になりました。ありがとうございます。

  • nora1962
  • ベストアンサー率60% (431/717)
回答No.1

お疲れ様です。 こんな感じでどうでしょう。 SELECT tbl1.* FROM tbl1 INNER JOIN ( SELECT tbl2.user_id,count(*) cnt FROM tbl2 GROUP BY tbl2.user_id) t2 ON tbl1.user_id = t2.user_id ORDER BY t2.cnt desc;

関連するQ&A

  • 別テーブルのカラムを利用してソートしたい

    別テーブルのカラムを利用してソートしたい MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」をテーブル「tbl2」のcountというカラムを利用して ソートしたいのですが、どのようなSQL文になるのでしょうか? 「tbl2」のidというカラムは外部キーで「tbl1」のidと関係しています。 テーブル「tbl1」 +------+---------+ |   id |  userid  | +------+---------+ |  1  | tanaka  | |  2  | sato   | +------+---------+ テーブル「tbl2」 +------+---------+ |   id |  count  | +------+---------+ |  1  |   10  | |  2  |   3   | +------+---------+ 次のような文かなと思ったのですが、エラーが返ってきます・・・ SELECT * FROM tbl1 ORDER BY (SELECT id FROM tbl2 ORDER BY count)

    • ベストアンサー
    • MySQL
  • 同じテーブル内同士で更新したい

    MySQLバージョン4.1.16を使用しています。 同じテーブル内で、user_idが「aaaa」のnumカラム値を 「bbbb」のnumカラム値でupdateしたいのですが、 次のようなsqlだとエラーが出てしまいます・・・ なんとかしてできる方法はないでしょうか? $sql = "UPDATE users SET num = (SELECT num FROM users WHERE user_id = 'bbbb') WHERE user_id = 'aaaa'"; Error Number: 1093 You can't specify target table 'users' for update in FROM clause テーブル「users」 +----------+---------+ |  user_id  |  num  | +----------+---------+ |  aaaa   |   1   |←成功すれば2になる +----------+---------+ |  bbbb   |   2   | +----------+---------+

  • 得られたカラムを利用して複数行を1文で取得したい

    MySQLバージョン4.1.16を使用しています。 テーブル「tbl1」のnoが2が保有しているuser_id(この場合はaaaa) の行を1つのSQL文で取得したいのですが、どのようなSQL文なるでしょうか? 例えばこの場合は1,2,4行目が取得できるようにしたいです。 また、PHPなどを利用して記述する場合に、 一旦、 select * from tbl1 where no = '2'; で得られたuser_id(aaaa)を変数に保存しておき、 それを利用してもう一度 select * from tbl1 where user_id = '{上のSQL文で得られた変数(中身はaaaa)}'; と二度記述してもできるのでしょうが、 初めの1つのSQL文で取得する場合と、2つのSQL文わけて取得する場合とでは 件数が多くなっていった時にどちらが早い遅いというのはあるのでしょうか? テーブル「tbl1」 +----------+---------+ |  user_id  |  no   | +----------+---------+ |  aaaa   |   1   | +----------+---------+ |  aaaa   |   2   | +----------+---------+ |  bbbb   |   3   | +----------+---------+ |  aaaa   |   4   | +----------+---------+

    • ベストアンサー
    • MySQL
  • テーブル結合の後に多重ソート

    複雑なルールで結合とソートをしたいのですが、可能でしょうか? mysql 4.1.21 です。 テーブルA shop_id | name | adress テーブルB shop_id | news_title | end_date |image| 上記テーブルをshop_id でleft joinで結合します。 その後ソートをする条件は まずend_date が過ぎているものは、news_titleや imageに何か入っていても、入っていないことにする。 次にテーブルBのnews_title に文字が入っていれば上位にソートされ さらにテーブルBのimageは1か0の数字が入っていて、1が上位にソートされる。 end_date の条件指定する部分で方法が見つかりません。 end_date の条件を無視すると下記sql で希望する結果が得られています。 select shop_id,shop_name from テーブルA left join テーブルB on テーブルA.shop_id = テーブルB.shop_id order by image desc,news_title <>'' desc です。 end_date が過ぎているものは image = '0' ,news_title ='' と同じことになります。 結合する時に、if文で判定してフラグカラムを作るなんて無理でしょうか?他に思いつく方法が無いのですが、、、 どなたかご教授お願いします。

    • ベストアンサー
    • MySQL
  • 一度に関連する他のテーブルの行も取得したい

    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テーブルの行まで取得したい

  • レコードAとBが等しい場合にupdateしたい!

    Mysqlの命令文作成で完全に詰まってしまって途方に暮れています。 添付画像にあるように、テーブルAのanwserの値とテーブルBのuser_answerの値が同じ場合に、テーブルBのanswer_flagを0から1に変更するというMYSQLの命令文を書きたいのですが、上手く行きません。。。 UPDATE tbl_quiz_log SET answer_flag = 1 WHERE user_answer = ANY( SELECT tbl_question.anwser FROM tbl_question INNER JOIN tbl_quiz_log ON tbl_quiz_log.question_id = tbl_question.question_id ) 何が間違っているのでしょうか? どなたかお力をお貸し頂けませんでしょうか? どうぞよろしくお願い致しますm(_ _)m ●補足 ※1 キャプチャー画像のカラムは一部のカラムのみ表示している状態です。 ※2 ちなみに、テーブルAのanswerがスペルミスなのは把握しております。

    • ベストアンサー
    • MySQL
  • GROUP BYで集約されるときのソートを変えたい

    GROUP BYで集約されるときのソートを変えたい MySQLの5.1を使用しています。 テーブル"tbl"には、"no","id","score"の3つのフィールドがあり、 "no"は主キーです。 +---+----+-------+ | no | id | score | +---+----+-------+ | 1 | 10 | 10002 | | 2 | 10 | 10000 | | 3 | 10 | 10008 | | 4 | 11 | 10004 | | 5 | 12 | 10006 | +---+----+-------+ 上記の表から、 scoreの値が高い順にグループ化してソートしたいのですが、 以下のSQL文ではscoreが最初に登録されたものに集約されてからグループ化されてソートしてしまうため、 思い通りの結果が得られずに困っています。 ↓具体例 SELECT no, id, score FROM tbl ORDER BY score DESC GROUP BY id; +---+----+-------+ | no | id | score | +---+----+-------+ | 5 | 12 | 10006 | | 4 | 11 | 10004 | | 1 | 10 | 10002 | +---+----+-------+ ↓欲しいソート順 +---+----+-------+ | no | id | score | +---+----+-------+ | 3 | 10 | 10008 | | 5 | 12 | 10006 | | 4 | 11 | 10004 | +---+----+-------+ テンポラリテーブルはなるべく使用せずソートしたいのですが、 このような事は可能なのでしょうか? ご存知の方がいらっしゃいましたら教えていただけると助かります。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • 複数のテーブルの全てのカラムを一度に検索するには?

    検索対象のカラムがid(主キー)、bc1~bc40と41個あります。 1つのテーブルに41個のカラムを作り検索させると非常に時間がかかります。 それにインデックスを全部に付けたいですが16個までしかつけられないです。 なので、5つのテーブルにカラムを分けて全部のカラムにインデックスをつけて それぞれを検索させようと思っています。 テーブルが1つだけなら SELECT * FROM `bc` WHERE `bc1`='あいうえおかき' AND `bc2`='あいうえおかき' AND `bc3`='あいうえおかき' AND ・・・ `bc39`='あいうえおかき' AND `bc40`='あいうえおかき' ORDER BY `bc33` DESC LIMIT 0,50; のようにできますが、テーブルが複数の場合はどうしたらよいのでしょうか。 検索を試す前に下記ができるか試してみました。 SELECT COUNT(*) FROM (((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id`) INNER JOIN `eee` ON `ccc`.`id`=`eee`.`id` エラーにはなりませんがカウント数が0になってしまいました。 SELECT COUNT(*) FROM (`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id` これは正確にできてカウント数100000 SELECT COUNT(*) FROM ((`ccc` INNER JOIN `bbb` ON `ccc`.`id`=`bbb`.`id`) INNER JOIN `aaa` ON `ccc`.`id`=`aaa`.`id`) INNER JOIN `ddd` ON `ccc`.`id`=`ddd`.`id` 4つ目のテーブルを入れたところから無理なようです。 他に良い方法はないのでしょうか。

    • ベストアンサー
    • MySQL
  • php mysql接続での書き方

    色々なサイトを拝見させて頂き勉強をしていると phpからmysqlで接続し呼び出すときに prepare(array(SELECT * FROM request WHERE id = ?,)); このような一文で呼び出すものと行数を分け prepare(implode(' ', array( 'SELECT *', 'FROM `request`', 'WHERE `id` = ?', このように書いているものとあります。 個人的には行数を分けていた方がわかりやすいので後者のほうで書いているのですが、これは作る人の気分でかき分けていいものなのか気になり質問させて頂きました。 また後者ではどういうタイミングで区切るのかわからないというのもあります。 SELECT * FROM users INNER JOIN category ON users.category = category.id INNER JOIN images ON users.category = images.id このように3つのテーブルを内部統合したくこの文を作りmysql上で叩くと3つ統合され表示されます。 しかし上記の文に当てはめphpから叩くとエラーがでます。 素直に1行で書けばよいのですが、分からないからというってスルーするのはあまり良くないかと重いご質問させて頂きました。 この3つのテーブルの場合、後者の書き方ではどのタイミングで区切るのでしょうか。

    • ベストアンサー
    • PHP
  • 行数について

    MySQLバージョン4.1.16を使用しています。 例えば、1ユーザごとに平均1000行を持たせるテーブルがあったとしたら それは良くない構造なのでしょうか? 1ユーザで1000なので、仮に1万ユーザ居たとしたらそれだけで 1万×1000=1000万行なので、恐らく駄目ですよね・・・(100行ぐらいなら許容範囲なのかな??) そういう場合、プログラム側で工夫するしかないのでしょうか? いきなり1000行を1行に纏めるは難しいと思いますが、 1つのカラムに('aaaa',11,'ああああ')と「,(カンマ)」で区切って入れるやり方や、 それともカラムの数を増やすやり方とか、どのような方法が良いのでしょうか?