LoginSignup
5
4

More than 5 years have passed since last update.

同じテーブルから違う条件でSELECTする

Last updated at Posted at 2017-04-04

追記

以下のようにも書けるようです。

SELECT
  Users.name,
  MAX(
    CASE WHEN UserMails.mail_type = 0 
      THEN UserMails.mail_address 
      ELSE '' 
    END
  ) AS mail_address,
  MAX(
    CASE WHEN UserMails.mail_type = 1
      THEN UserMails.mail_address 
      ELSE '' 
    END
  ) AS mobile_mail_address
FROM users Users
LEFT JOIN
  user_mails UserMails
  ON Users.id = UserMails.user_id
GROUP BY Users.id, Users.name
ORDER BY Users.id, Users.name

@asahina_dev さん、ありがとうございました。

以下、修正前の内容

例えばuser_mailsっていうテーブルにユーザーのメールアドレスが入ってて、
mail_typeカラムでPCとか携帯とかのタイプ分けがされているものを一緒にSELECTする場合

users テーブル
┌────┬───────┐
│ id │ name  │
├────┼───────┤
│ 1  │ user1 │
└────┴───────┘

user_mails テーブル(mail_type = 0 がPC、 mail_type = 1 が携帯)
┌────┬─────────┬──────────────────┬───────────┐
│ id │ user_id │ mail_address     │ mail_type │
├────┼─────────┼──────────────────┼───────────┤
│ 1  │ 1       │ hoge@example.com │ 0         │
├────┼─────────┼──────────────────┼───────────┤
│ 2  │ 1       │ fuga@example.com │ 1         │
└────┴─────────┴──────────────────┴───────────┘
SELECT
  Users.name,
  UserMails.mail_address,
  UserMobileMails.mail_address AS mobile_mail_address
FROM users Users
LEFT JOIN
  user_mails UserMails
  ON Users.id = UserMails.user_id
  AND UserMails.mail_type = 0
LEFT JOIN
  user_mails UserMobileMails
  ON Users.id = UserMobileMails.user_id
  AND UserMobileMails.mail_type = 1
WHERE Users.id = 1
結果
┌───────┬──────────────────┬─────────────────────┐
│ name  │ mail_address     │ mobile_mail_address │
├───────┼──────────────────┼─────────────────────┤
│ user1 │ hoge@example.com │ fuga@example.com    │
└───────┴──────────────────┴─────────────────────┘

って感じに複数JOINして別名を付けてあげるといいらしい。
ただメールアドレスがPC携帯の2種類、電話番号が自宅携帯会社の3種類とかあると
それだけで5回JOINすることになってしまう。
もうちょっと簡潔に書ける方法ってないのかな・・・

5
4
3

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4