2017-02-27 6 views
0

私は2つのテーブル、ユーザーと調査を持っています。私はテーブルユーザにクエリを行い、ユーザテーブルの各レコードに対して最も低い値を持つ調査レコードのみが返されるようにテーブル調査に参加したい。 サブクエリと一時テーブルを避けたい。最低値のレコードを結合する

表のユーザー:

-------------- 
| uid | name | 
-------------- 
| 1 | mike | 
| 2 | john | 
| 3 | bill | 
-------------- 

表調査:

---------------------- 
| id | uid | value | 
---------------------- 
| 1 | 3 | 9  | 
| 2 | 3 | 5  | 
| 3 | 1 | 3  | 
| 4 | 1 | 7  | 
| 5 | 1 | 2  | 
| 6 | 2 | 4  | 
| 7 | 2 | 9  | 
| 8 | 1 | 0  | 
| 9 | 2 | 5  | 
--------------------- 

予想される出力:

--------------------- 
| id | name | value | 
--------------------- 
| 8 | mike | 0  | 
| 2 | bill | 5  | 
| 6 | john | 4  | 
--------------------- 

私が参加し、どのような操作を行う必要があり、またはどのように私は、クエリを記述する必要がありますか?

+2

サブクエリを使用して、調査テーブルから目的のレコードを返し、それをユーザーテーブルに追加します。 –

+0

テーブルには最大100万のレコードが含まれます。サブクエリはそれを非常に遅くしませんか? – JoeBateMuma

+0

これは、おそらくインデックスが存在し、データベースサーバの仕様 –

答えて

0

次のクエリは、最小値を持つすべての行を取得します(選択した値の下の値を持つ別の調査を存在しない)

これを試してみてください:

SELECT u.*, s.value 
FROM survey s 
JOIN users u 
    ON s.uid = u.uid 
WHERE NOT EXISTS(
    SELECT 'maximum' 
    FROM survey s2 
    WHERE s2.uid = s.uid 
    AND s2.value < s.value) 
0

あなたはこのようなもの使用することができます

select s.id, u.name, y.min_value 
    from 
    (
     select uid, min(value) as min_value 
     from survey 
     group by uid 
    ) y 
    join survey s 
     on s.value = y.min_value 
     and s.uid = y.uid 
    join user u 
     on u.uid = y.uid 
0

私はこれがあなた

SELECT * FROM SURVEY S 
INNER JOIN USERS U 
ON S.UID=U.UID 
QUALIFY ROW_NUMBER() OVER (PARTITION BY S.UID ORDER BY S.VALUE1 ASC)=1; 
助けになると思います
+0

です。質問はMySQLに関するものです。これはMySQLのようには見えません。 – Pang

+0

SELメイン。 ID、SURVEY S INNER FROM( SEL S.ID、S.UID、S.VALUE1、COUNT(*)FROM main.UID、main.VALUE1 ROW_NUMBERS ASはS.UID = B.UID 調査のB をJOIN答えASとS.ID、S.UID、S.VALUE1 BY> = B.VALUE1 GROUP S.VALUE1)メイン INNERはUSERSのJOIN U ON main.UID = u.UID AND ROW_NUMBERS = 1 それをマークしてください – user2466009

関連する問題