1

クエリの適切な構文を作成する方法がわかりません。

これが私が引っ張っているものです。私は2つのテーブルを持っています。

Table 1 : Fields  (user_id, name)
Table 2 : Fields  (user_id, type, are_code, phone_number).

表 1 は、user_id ごとに 1 つのレコードのみを持つことができます。

1 | John Doe

表 2 には、user_id ごとに最大 3 つのレコードを含めることができます。

1 | Home | 123 | 456.4567
1 | Work | 000 | 987.1467
1 | Mobi | 098 | 987.1756

テーブルが次のようにプルされる 1 つのレコードになるように、すべてを選択するにはどうすればよいですか。

user_id | name | home# | work# | mobi#

私はこれを試しました。これは、表 2 内のエントリの量に基づいて行を複製および倍増させます。

SELECT a.user_id, 
       b.area_code, b.phone_number
FROM users a
INNER JOIN user_contact_phones b ON a.user_id = b.user_id

残念ながら、それは良くない3行を返しました:(。

1 | John Doe | area | home# | 
1 | John Doe | area | work# |
1 | John Doe | area | mobi# |

どんな助けや指針も大歓迎です。

4

3 に答える 3

2

これを試してください:

SELECT
  u.user_id,
  u.name,
  MAX(CASE WHEN p.type = 'Home' THEN phone_number END) HomeNumber,
  MAX(CASE WHEN p.type = 'Work' THEN phone_number END) WorkNumber,
  MAX(CASE WHEN p.type = 'Mobi' THEN phone_number END) MobiNumber
FROM phones p
JOIN users u ON p.user_id = u.user_id
GROUP BY u.user_id, u.name

出力:

| USER_ID |     NAME | HOMENUMBER | WORKNUMBER | MOBINUMBER |
|---------|----------|------------|------------|------------|
|       1 | John Doe |   456.4567 |   987.1467 |   987.1756 |

ここでフィドル。

また、決定するu.name場合は削除できることにも注意してください...主キーのように見えるため、これが最も可能性が高いです。それは物事を少しスピードアップするでしょう。u.user_idu.name

注:これは、同じユーザーに対して複数の同じタイプを持つことができないことを前提としています(例のデータにあるように、自宅、職場、モバイル用に1つの列しかありません.

于 2013-10-23T18:09:54.933 に答える
1

user_contact_phones.typeあなたが望むものを正確に得るために使用してください-

SELECT a.user_id, 
       b.area_code, b.phone_number
FROM users a
INNER JOIN user_contact_phones b ON a.user_id = b.user_id where b.type='Home'
于 2013-10-23T18:06:28.190 に答える
0

これがうまくいく解決策です:

select u.user_id, u.name,
    thome.area_code as home_area_code, thome.phone_number as home_phone_number,
    twork.area_code as work_area_code, twork.phone_number as work_phone_number,
    tmobi.area_code as mobi_area_code, tmobi.phone_number as mobi_phone_number  
from table1 u
    left outer join table2 thome on u.user_id = thome.user_id and thome.type = 'Home'
    left outer join table2 twork on u.user_id = twork.user_id and twork.type = 'Work'
    left outer join table2 tmobi on u.user_id = tmobi.user_id and tmobi.type = 'Mobi'

特定のタイプのレコードが存在しない場合は、内部結合ではなく左外部結合を使用することに注意してください。左外部結合を使用すると、結果セット内のこれらの列に対して null 値が取得されます。内部結合では、3 つのタイプすべてを持たないユーザーの結果は得られません。幸運を!

于 2013-10-23T18:07:29.260 に答える