• ベストアンサー

アドレスを重複させずに表示したい

MYSQLは初心者なので教えてください。 アドレス,名前,都道府県 *****@*****,大木.福岡県 みたいな形式でmysqlのデータベースに アドレスと名前、都道府県が登録されています。 アドレスも名前も都道府県も重複されて登録されている 可能性があります。 福岡県の人にメールを送りたいので、検索する場合 SELECT * FROM `テーブル名` WHERE `Prefecture` = '福岡県' だとアドレスが重複している可能性があります。 このままメールを送るとメールが2回送られてしまう可能性が あります。 かといって SELECT DISTINCT `address` FROM `tyokusetusoudan` WHERE `Prefecture` = '福岡県' だと名前や都道府県名が表示されないので困っています。 アドレスを重複させずに名前や都道府県も表示するように 検索したいのですが、どうすればいいのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

>同じアドレスは必ず同じ名前に対応づけられてはいませんでした。 >中にはアドレスのみ記入されていて他の部分は空白のデータもあります。 アドレスと名前の対応が完全には取れていないとのことなので、各`address`でどういうルールで名前を取り出すかをMySQLに対して指示してやる必要があります。`address`でグループ化して、名前はmax関数で得るようにすれば、少なくとも何らかの名前が入っている行が検索できると思います。 ※いくらなんでも、「ooki@ooki.jp」が「大木」、空白以外とも対応付けられているということはないうですよね? select `address`,max(名前) as 名前, max(都道府県) as 都道府県 from `tyokusetusoudan` where `Prefecture` = '福岡県' group by `address` ※MySQLの場合は、上記SQLにおいて、「max(都道府県) as 都道府県」を単に「都道府県」としてもエラーにならないのですが、他のRDBMSで使った場合などでエラーになってしまうので、実行結果に違いはありませんがmax関数を使っています。 http://dev.mysql.com/doc/refman/4.1/ja/group-by-hidden-fields.html

OKIaHUKUOKA
質問者

お礼

> ※いくらなんでも、「ooki@ooki.jp」が「大木」、 >空白以外とも対応付けられているということはないうですよね? HTMLのフォームから 名前とメールアドレスを「<input type="text"> 」 都道府県名を「<select><option> 」 で入力してもらったデータをそのままデータベースに入れただけです。 なので人によってはどんなデータを入れてくるのか予測がつきません。 > select `address`,max(名前) as 名前, max(都道府県) as 都道府県 > from `tyokusetusoudan` > where `Prefecture` = '福岡県' > group by `address` ありがとうございます。 教えてもらった方法でやったところうまくいきました。 >`address`でグループ化して、名前はmax関数で得るようにすれば、 >少なくとも何らかの名前が入っている行が検索できると思います。 少なくとも重複さえなければ・・・と思っていたのですが、 何らかの名前が入っている行が検索できるのであれば それに越したことはありません。助かります。 ありがとうございました。

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

>ooki@ooki.jp,大木,福岡県 ooki@ooki.jpが「大木」であるとどうやって判断するのでしょうか? 普通にやっていては特定できませんよ。 ただmysqlの場合どれが選ばれるか保障はないですが以下のような書式を 記述することができるはずです。 select `address`,`名前`, `都道府県` from `tyokusetusoudan` where `Prefecture` = '福岡県' group by `address` たとえば、一番最初に出てきた人とかなにか条件がないかぎり「大木」が 確定されることはありません。

回答No.2

>文章だけで説明するのは難しいので >ご容赦下さい。 格納データ例と得たい結果例を示してもらえれば、一番分かりやすいのですけどね。 アドレス、名前、都道府県が重複して登録されているとのことですが、同じアドレスは必ず同じ名前に対応付けられていますよね? アドレス 名前 メアド1 田中 メアド1 田中 そうであれば、 select distinct `address`,名前, 都道府県 from `tyokusetusoudan` where `Prefecture` = '福岡県' とすればいいのでは?

OKIaHUKUOKA
質問者

補足

>格納データ例と得たい結果例を示してもらえれば、一番分かりやすいのですけどね。 >アドレス、名前、都道府県が重複して登録されているとのことですが、 >同じアドレスは必ず同じ名前に対応付けられていますよね? 調べてみたところ、同じアドレスは必ず同じ名前に対応づけられてはいませんでした。 中にはアドレスのみ記入されていて他の部分は空白のデータもあります。 ooki@ooki.jp,大木,福岡県 ooki@ooki.jp,,福岡県 yabe@yabe.jp,矢部,茨城県 hamasaki@hamasaki.jp,浜崎,愛知県 ayumi@ayumi.jp,,福岡県 上記のようなデータで試したところ select distinct `address`,名前, 都道府県 from `tyokusetusoudan` where `Prefecture` = '福岡県' だと ooki@ooki.jp,大木,福岡県 ooki@ooki.jp,,福岡県 ayumi@ayumi.jp,,福岡県 が表示されました。 名前が2通りあるので「ooki@ooki.jp」は違うデータだと判断されて2回表示されているみたいです 得たい結果の例は ooki@ooki.jp,大木,福岡県 ayumi@ayumi.jp,,福岡県 です。 分かりにくくてすみません

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

いまいち状況がよくわかりません。 逆に福岡県がprefectureに数回でてくるならメールを数回おくらないと いけないのでは? とりあえず、「どうでもいいので1回だけ」という縛りなら LIMIT 1 をつけてやればいいでしょうけど・・・

OKIaHUKUOKA
質問者

補足

分かりにくいようですみません。 文章だけで説明するのは難しいので ご容赦下さい。 >逆に福岡県がprefectureに数回でてくるならメールを >数回おくらないといけないのでは? 同じ人に同じメールを何回も送ったらスパムメールに 思われて怒られてしまうので、アドレスが重複して 登録されている分については表示させたくないということです。 LIMIT 1 をつけて試したところデータが1件しか表示されませんでした。 データベースには多くの方のアドレスが登録されています。 「福岡県に登録されているアドレスについては全て表示させる」 なおかつ 「重複して同じアドレスが登録されている場合には一つだけ表示させる」 と言うことをしたいのです。

関連するQ&A