2010-12-24 8 views
0

私は2つのテーブルを持っており、以下のことをしたいと思います。最初のテーブルから、与えられた条件を満たすすべての行を抽出します。抽出されたすべての行について、私は最初の列から値を取ります。すべての値について、最初の列に指定された値を含む2番目のテーブルからすべてのローを抽出します。 2番目のテーブルから抽出されたすべてのローは特定の方法で順序付けされなければならず、最初の1つのローだけを取りたい(オーダーの基準に従って)。これは私の問題です、私はどのように順序の基準の最高値と1つの行を取るか分からない。最大値を持つ行を抽出する方法は?

| aaa | Bob | 
| bbb | Eva | 
| ccc | Bob | 

第二のテーブル::私はボブを含むすべての行を取る最初のテーブルから

| aaa | 111 | 1 | 
| aaa | 342 | 2 | 
| ccc | 576 | 1 | 
| ccc | 749 | 3 | 

最初のテーブルを追加しました。これらの行の最初の列には、「aaa」と「ccc」という値が含まれています。 2番目のテーブルの "aaa"には2つの行があり、最後の列に最大値を持つものを取りたいと思います。だから、私は|aaa|342|2|を持っています。同じことを「ccc」と同じです。私はこの行をとる| ccc | 749 | 3 |。最後に、最後の列の値に従って2つの行を並べ替えることにします。

は、私はちょうど問題の本質は、以下の通りであることを認識している2

を追加しました。与えられた表で私はに、最初の列の同じ値を含むすべての行を1つの "代表的な"行(3番目の列の最大値)に置き換えます。より詳細には、私はこのテーブルを置換する:このいずれかで

| aaa | 111 | 1 | 
| aaa | 342 | 2 | 
| ccc | 576 | 1 | 
| ccc | 749 | 3 | 

| aaa | 342 | 2 | 
| ccc | 749 | 3 | 
+1

ミステリーテーブルのスキーマを教えてください。 ...そして、いくつかのタイプミスを修正してください... – ajreal

+0

これをすべて1つのクエリで行い、最終的に注文基準の最高値を持つ2番目のテーブルから1行を返したいとしますか? –

+0

私はいくつかの詳細を追加しました。 – Roman

答えて

2
select t2.* 
    from t1 
    join t2 on t2.id = (select t2c.id 
         from t2 as t2c 
         where t2c.t1_id = t1.id 
         order by t2c.val desc 
         limit 1) 
where t1.name = 'Bob' 
order by t2.val 

あなたは、列名を指定していなかったので、私はそれらを作りました。

t2.idは一意でなければなりません。

+0

クエリが正しいように見えます。私は私の答えを削除するつもりです。ちょうど私のコメントを再び入れてください。私は尋ねました - PhpMyAdminのようなツールでできること全てを自由に行える無料のオンラインデータベースサーバーを誰かに教えてください。そのようなものが存在しますか? jsコードをテストするためのjsfiddleがあるように。私はあなたが提案したsqlzoo.netをチェックしましたが、これは私にすべてのことをさせることはできません。テストすることができますが、自分自身を作成することはできませんいくつかの事前定義されたテーブルなどがあります。 –

+0

はこのhttp://stackoverflow.com/questions/4526445/free-online-tools-for-testing-mysql-queries-having-features-like-phpmyadminの質問をしました –

1

これは相関サブクエリを使用して実現できますが、パフォーマンスは非常に悪くなります。

mysql> select * from user; 
+--------+-----------+ 
| userid | user_name | 
+--------+-----------+ 
| aaa | Bob  | 
| bbb | Eva  | 
| ccc | Bob  | 
+--------+-----------+ 
3 rows in set (0.00 sec) 

mysql> select * from user_data; 
+--------+-------+------+ 
| userid | value | num | 
+--------+-------+------+ 
| aaa | 111 | 1 | 
| aaa | 342 | 2 | 
| ccc | 576 | 1 | 
| ccc | 749 | 3 | 
| bbb | 1000 | 1 | 
| bbb | 800 | 2 | 
+--------+-------+------+ 
6 rows in set (0.00 sec) 

mysql> SELECT u1.userid,u1.user_name,ud1.value from user_data ud1 join user u1 ON ud1.userid=u1.userid where ud1.value=(SELECT value FROM user_data ud2 WHERE ud2.userid=ud1.userid ORDER BY value desc LIMIT 1) AND u1.user_name='Bob'; 
+--------+-----------+-------+ 
| userid | user_name | value | 
+--------+-----------+-------+ 
| aaa | Bob  | 342 | 
| ccc | Bob  | 749 | 
+--------+-----------+-------+ 
2 rows in set (0.00 sec) 
関連する問題