• ベストアンサー

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

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

  • MySQL
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
回答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

  • SQL 複数のテーブルから重複なしでデータを取得

    同じフィールド名[名前]を持つテーブルが複数個あります。 仮にテーブル名を、A、B、C、Dの4個だとします。 それらのテーブルから、フィールド名[名前]のデータを重複なしで取得したいのですが、SQL文が思いつきません。 取得するフィールドは[名前]だけです。 select distinct(名前) from A union select distinct(名前) from B union select distinct(名前) from C union select distinct(名前) from D だと、各表に同じ名前が存在する場合は結果も重複してしまい、期待する結果が得られませんでした。 環境はOracle 9iです。 SQL文を教えてください。よろしくお願いします。

  • 重複が

    新規登録の時の重複をチェックしたいです テーブルのカラムはシンプルにidとnameとpassだけです nameに同じ名前の人がいると困るので、HTMLフォームから送られた名前と登録してある名前の重複がないかチェックするようにできますか? やってみましたが動きません(ーー;; $name = mysql_real_escape_string($_POST['name']); $name3=array(); $name2 = mysql_query('SELECT name FROM hoge2 WHERE name=$name'); while($data = mysql_fetch_assoc($name2)) { array_push($name3, $data['name']); } if(isset($name3)){ print "重複があります"; }else{ //ここからsql $sql = sprintf('INSERT INTO hoge2 SET name="%s", pass="%s"', $name, mysql_real_escape_string($_POST['pass']) ); //ここまで mysql_query($sql) or die(mysql_error()); }

    • ベストアンサー
    • MySQL
  • 重複

    SELECT DISTINCT 列名、・・・FROM テーブル名は 重複した行を取り除いた結果を得ることができますが、 逆の重複した行をのみを得ることは出来るのでしょうか。 もし出来るとしたらどのような関数なのでしょうか? ご教授お願い致します。

  • INSERTを行う際に別の表のデータを使用する方法について

    Java(Servlet,jsp)、MySQL、Tomcatを使用して開発をしています。 INSERTを行う際に別の表のデータを使用したいのですが、 上手くいきません。 ご教授願いただけますと幸いです。 ■テーブル名:A_mst ■カラム 名前: Name 誕生日: Birthday 都道府県コード: Prefecture_Cd 住所: Address ■テーブル名:B_mst ■カラム 都道府県コード: Prefecture_Cd 都道府県名: Prefecture_Name ■処理内容 パラメーターから取得した「名前、誕生日、都道府県、住所」をA_mstに登録する。 ※A_mstには都道府県列はないため、B_mstから都道府県コードを取得しなければなりません。 String sql = "INSERT INTO A_mst" +"SELECT Prefecture_Name FROM B_mst" +"WHERE Prefecture_Name = Prefecture_Name" +"(Name,Birthday,Prefecture_Cd,Address)" +"values('#1','#2','#3','#4')"; sql = sql.replaceAll("#1",strNname); sql = sql.replaceAll("#2",strBirthday); sql = sql.replaceAll("#3",strPname); sql = sql.replaceAll("#4",strAddress); バージョンは以下になります。 jdk1.6.0_16 Tomcat 6.0 MySQL Server 5.1 何卒よろしくお願いいたします。

  • select文のwhere句に配列を入れて検索したいのです。

    はじめまして。php5とpostgresを使って、ブラウザで都道府県をセレクトで複数選択(prefecture[])して、postgresに select city from city_table where p_id='prefecture'; としているのですが、結果を出力できません。 print_rで見たところprefectureに複数選択した都道府県のidが配列として入っていることは確認しております。 where句に配列を入れて検索するにはどうすれば良いのでしょうか? よろしくお願いいたします。

  • MySQLで戻り値が重複している

    PHPとMySQLを使っています。 下のようなSQL文を作成し、値を引き出そうとしています。 <SQL文> SELECT * FROM table_name WHERE A = "あ" AND B='い' <DBに登録済みの取り出したいデータ> あ、い、う、え、お ところが、戻ってくる値が、 あ、あ、い、い、う、う、え、え、お、お のように、値が重複して戻ってきます。 いろいろ調べましたが、原因がさっぱりわかりません。 ご存知の方、教えていただけると助かります。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • EXCELのVBAで重複を除いたカウント

    EXCELのVBAでSQLの SELECT COUNT(DISTINCT(ITEMS)) FROM TABLE WHERE SHOP = 'A' と同様のことを行いたいのですが、どのように考えたらよいでしょうか。 同じようなことができる関数でもよいです。

  • アクセスで重複のカウント

    アクセスで重複排除後のカウントを行いたいのですが・・。例えば、TEST1テーブルのaaaカラムの重複排除後のカウントを知りたい場合、一般的には、SELECT COUNT(DISTINCT aaa) FROM TEST1となると思いますが、アクセスではどのような記述ができるのでしょうか?宜しくお願いします。

  • サブクエリとDISTINCTGROUPBYの併用は不可??

    SQLで副で問い合わせたときグループバイやDISTINCTがエラーになってしまいます。 何故なのか検討がつきません。 同じデータを持つ様々なデータベースでやってますがどれもエラーになります。 オラクルやMYSQLやpostgreSQLです。 SELECT * FROM TableName WHERE 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '竹輪') AND 担当 IN (SELECT 担当 FROM TableName WHERE 売上品 = '胡瓜') AND 売上品 IN ('竹輪','胡瓜') ; これは普通に出来ます。 これに対して… SELECT distinct 担当, 商品, 売上品 from…かGroup By 担当, 商品とやっても何故かエラーが出ます… 何か間違ってますでしょうか?

  • 重複をせずに2つのフィールドを取得

    id name points ----------- 1 aa 20 2 bb 10 3 bb 20 4 cc 10 5 bb 30 このデータベースから、nameの重複を避けて、pointsの最大値を取得して name points ----------- aa 20 bb 30 cc 10 を得たくて select distinct name points from mytable where id > 0 order by name を思いつきましたが、これではだめでした。 SQL文を教えてください。