2016-12-04 9 views
0

私が住んでいる複合施設には、わずか100人以上の住人の小さなMySQLデータベースがあります。単純化するために、ユニット番号、姓、名、電話番号、電子メールアドレスが含まれています。MySQLの選択結果で重複した行をインテリジェントに結合する

UNIT,SURNAME,FIRST_NAME,PHONE 
1,Evans,Bob,12345 
2,Smith,Jane,23456 
2,Smith,Jim,23456 
3,Jones,Joe,45678 
4,Jones,Jason,98765 
5,Wong,Bill,95147 
5,Lee,Jane,95147 

上記のデータを要約すると::

ここではいくつかのサンプルデータです。..

電子メールアドレスは、質問とは無関係ですが、同じ単位で同じ姓を持つ人々が異なるエントリを持っているなぜ彼らは説明します

  • ボブ・エヴァンスジェーンジム・スミスは、同じユニットで一緒に住んでいるので、同じ電話番号(ただし、異なる電子メールアドレス、separatを持って&
  • 、彼自身に住んでいます電子メールアドレス
  • ジョー・ジョーンズとジェイソン・ジョーンズは、同じ姓を共有しているにもかかわらず、異なるユニットに住んでおり、(明らかに)電話番号が異なります。
  • ビルウォンとジェーンリーは一緒に住んでいて、異なる姓があります。

同じ電話番号を共有する同じ姓の2人を知的に認識する電話リスト(姓でソートされたもの)を生成する選択クエリを作成したいとします(同じユニット番号を共有するという事実は私は実際のMySQLクエリとは無関係だと思います)、結果に1行にまとめると同時に、別の姓の人に同じ電話番号を分けたままにします。言い換えれば、上記のデータの選択の結果は次のようになります、

SELECT unit, surname, phone, 
group_concat(first_name order by first_name SEPARATOR ' & ') AS name 
FROM owners 
GROUP BY surname; 

しかしこと:

UNIT,SURNAME,FIRST_NAME,PHONE 
1,Evans,Bob,12345 
4,Jones,Jason,98765 
3,Jones,Joe,45678 
5,Lee,Jane,95147 
2,Smith,Jane & Jim,23456 
5,Wong,Bill,95147 

Someresearchはほとんど私が欲しいものを行い、次のクエリに私を導きましたジョー・ジョーンズの電話とユニット番号の下ジョー・ジョーンズとジェイソン・ジョーンズを兼ね備え:

3,Jones,Joe & Jason,45678 

私はジョー・ジョーンズとジェイソン・ジョーンズを保つために、そのクエリを絞り込むしたいと思いれます自分の電話番号で自分の別のエントリ。それが助けになると、各行に主キー "id"列があります。

ご意見やご指摘をお待ちしております。どうもありがとう。

クレイグ

答えて

0

私はgroup by句にunitまたはphone列を追加しようと:

例:

group by surname, unit

group by surname, phone

ます。また、両方を追加することができます列:

group by surname, unit, phone

+0

ありがとうakrys、。私は、実際のリストを生成するために使用するスクリプトで正しい順序で列を取得します。 – CraigH

0

まあ、私は少し違うと思うだろう、最初にあなたは1が実際に列をGROUP BY必要があるため、(追加するものがある場合)同じUNITためFIRST_NAMEを追加し、その後UNITによってグループにそれを必要とします列を区切る列ではなく列を区切ります。

SELECT 
owners.unit, 
owners.surname, 
owners.phone, 
/* IF there is a second first_name from the join */ 
IF(LT.first_name IS NOT NULL, CONCAT(owners.first_name, ' & ', LT.first_name), owners.first_name) 
FROM owners 
/* JOIN the table again, based on the params below */ 
LEFT JOIN owners LT ON(LT.unit=owners.unit AND LT.first_name != owners.first_name) 
GROUP BY owners.UNIT; 

私がまさに必要でし作業SQLFiddle

+0

ありがとうございました。残念ながら、あなたのSQLはビルウォンとジェーンリーを兼ね備えています。結果はユニット番号でソートされます。あなたのSQLに "where"句を導入すると、実際に電話リストに登録したいと思っている所有者だけを選択しようとすると問題が発生します(元の問題には含まれていなかった変数私はそれがあなたの解決策にないことを理解しています)。 – CraigH

関連する問題