69661


あるテーブルに key が書かれていて  
それを別にサブテーブルを引いた結果に置き換えて返したいです  
サブテーブルが「１：１」なら普通にJOINするだけでいいんですが  
サブテーブルが「１：多」の関係になってる場合ただJOINしただけだとデータが重複してしまいます

users table

[code]

    user | pref_code
    -----+----------
      1  |  13
      2  |  13
    
[/code]

cities table

[code]

    pref_code | pref | town
    ----------+------+------
    13        |東京都 | 足立区    
    13        |東京都 | 新宿区
      :
    
[/code]

こういうテーブルになってる時に

[code]

    user | pref
    -----+----------
      1  | 東京都
      2  | 東京都
    
[/code]

という感じに返したいです

[code]

    SELECT user, pref FROM users
    LEFT_JOIN cities USING(pref_code)
    
[/code]

と書いてしまうと

[code]

    user | pref
    -----+----------
      1  | 東京都
      1  | 東京都
      :  |
      2  | 東京都
      2  | 東京都
      :  |
    
[/code]

という感じでサブテーブルの分だけ重複してしまいます

イメージとしては

[code]

    SELECT 
      user,
      (SELECT pref FROM cities WHERE users.pref_code = cities.pref_code LIMIT 1)
    FROM users
    
[/code]

みたいなことをしたいんですがどう書けばいいでしょうか


CC BY-SA 4.0
2020-08-18T11:52:51.927
69660
2020-08-20T08:17:48.797
2020-08-18T16:33:46.370
3060
question
mysql
SELECT の中で値を別テーブルを引いて置換したものに置き換えたい


難しく考えないで、重複を取り除きたいのであれば

[code]

    SELECT DISTINCT user, pref FROM users
    LEFT JOIN cities USING(pref_code)
    
[/code]

というように`DISTINCT`を使えばよいと考えます。

* * *

コメントを受けての追記:

> 後学のために聞きたいんですがサブテーブルの値が異なる時(今回でいうtownの値)にどれでもいいから１つ値を埋めたいみたいな時はどうすればいいんでしょうか

この調子でいくと、〜の場合はどうすればいいですか？と続いてしまいそうなので、一般的なことを記載します（おそらく質問者さんも "みたいな"
と形容されているので、一般的なことが聞きたいのではないかとも推測）。

[MySQL Nested Select Query? - Stack
Overflow](https://stackoverflow.com/questions/19964640/mysql-nested-select-
query) の [回答](https://stackoverflow.com/a/19964673/1979953) に
`FORM`の中に`SELECT`文を書く方法（ネストさせる方法が）が載っていますので、やりたいことに応じて複雑なSQLを構築することが可能です。

質問者さんも`SELECT`文の中に`SELECT`文を書かれています。しかし`JOIN`等で用いたい場合は`SELECT`文の中にネストさせるやり方ではうまくいかないでしょう。

他にもネストの例はたくさんありますので、適切なものを調べて構築するとよいかと考えます。下記は`JOIN`の中にネストさせる方法。  
[Nested Select statement in MYSQL join - Stack
Overflow](https://stackoverflow.com/questions/7194547/nested-select-statement-
in-mysql-join) の [回答](https://stackoverflow.com/a/7195466/1979953)

[MySQL Select rows on first occurrence of each unique value - Stack
Overflow](https://stackoverflow.com/questions/12065931/mysql-select-rows-on-
first-occurrence-of-each-unique-value) というようなのもありました。

今回だとこんな感じです（[group-by
cheat](https://stackoverflow.com/a/12065956/1979953)で実装しました）。

[code]

    SELECT 
      DISTINCT user, pref, town
    FROM 
      users
    LEFT JOIN
      (select * from cities group by pref_code) hoge
    USING(pref_code)
    
[/code]

下記のようなテストデータから

[code]

    pref_code     pref     town
    ---------------------------------
    13            Foo    A
    13            Foo    B
    14            Bar    A
    14            Bar    B
    
    user   pref_code
    --------------
    1      13
    1      13
    2      14
    2      14
    
[/code]

以下が取得できました。

[code]

    user pref town
    --------------
    1    Foo   A
    2    Bar   A
    
[/code]

* * *

[こちら](https://stackoverflow.com/a/52413297/1979953)を参考にして下記のようにも書けました。リンク先によるとMySQL
8から使える機能だそうです。

[code]

    SELECT 
      DISTINCT user, pref, town
    FROM 
      users
    LEFT JOIN (
      SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY pref_code) rn FROM cities) t WHERE rn = 1
    ) hoge
    USING(pref_code)
    
[/code]


CC BY-SA 4.0
2020-08-18T11:58:46.887
69661
2020-08-20T08:17:48.797
2020-08-20T08:17:48.797
9008
9008
69660
answer