2017-09-08 9 views
0

私はMySQLを習得しようとしていましたが、重複を選択しないように結合クエリを作成する際に問題があります。join/whereで重複を選択していません

基本的に、私がでてるのはここです:

SELECT atable.phonenumber, btable.date 
FROM btable 
LEFT JOIN atable ON btable.id = atable.id 
WHERE btable.country_id = 4 

しかし、私のデータベースでは、列atable.phonenumberで重複行を持つ可能性があります。例えば

(明確にするために添加アスタリスク)

phonenumber | date 
-------------|----------- 
*555-681-2105 | 2015-08-12 
555-425-5161 | 2015-08-15 
331-484-7784 | 2015-08-17 
*555-681-2105 | 2015-08-25 

..など。

私はSELECT DISTINCTを使用しようとしましたが動作しません。私はまたGROUP BYを推奨した他の解決策を探していましたが、それはエラーを投げました。おそらく私のWHEREの条項と条件のためです。どのように私は簡単にこれを達成することができますか分からない。あなたがだけ見ているので、重複した電話番号を取得している任意の行の値は、行が一意作りに参加することができる

-

+0

ここでの質問は、異なる値とは何ですか?あなたのアスタリスクされた行のどれが返されるべきかのように、日付が異なるので、 –

+0

私は、日付が同じである可能性について心配していません、私は電話番号が同じであることだけを心配しています。私が本質的に達成しようとしているのは、同じ電話番号を持つ行を選択しないことです。 –

+0

さらに明確にするために、同じ電話番号の行を1回選択したいのですが、同じ電話番号が20の異なる行に返ってくることは望ましくありません。 –

答えて

1

DISTINCTは、基本的に「私だけのユニークな行をしたい」と言って、全行が返されるに適用されます分離したカラム。データベースは電話番号と日付も調べています。投稿した行の日付が異なるため、行が異なる原因になります。

コメント欄の推奨者としてお勧めします。あなたがグループ化を使用するクエリを書くとき、あなたは価値の組み合わせの一組だけが何のために存在している行のセットを取得します

SELECT atable.phonenumber, max(btable.date) 
FROM battle 
LEFT JOIN atable ON btable.id = atable.id 
WHERE btable.country_id = 4 
GROUP BY atable.phonenumber 

:あなたは電話番号の最新の日付をしたい場合は、これを行いますグループごとに一覧表示されます。この場合、一意の電話番号のみ。しかし、他の値(つまりDate)も必要とするため、集合関数と呼ばれるものを使用しなければなりません。ユニークな集合の一部ではないさまざまな値すべてで何をしたいのかを指定する必要があります。場合によってはMAXまたはMINになることもありますが、SUM、COUNT、AVGなどになることもあります。

プログラミングの他の場所にあるハッシュテーブルや辞書に精通している場合は、これはグループによるものです。値のセット(キー)をそれらのキー値を持つ行のリストにマップしてから集約関数は、グループを使用した場合、キー

単純なルールに関連付けられたリストの値のいずれにも適用される(とMySQLがあなたのために暗黙的に行います1)は、このようにクエリを記述することです:

SELECT 
    List, 
    of, 
    columns, 
    you, 
    want, 
    in, 
    unique, 
    combination, 
    FN(List), 
    FN(of), 
    FN(columns), 
    FN(you), 
    FN(want), 
    FN(aggregating) 
FROM table 
GROUP BY 
    List, 
    of, 
    columns, 
    you, 
    want, 
    in, 
    unique, 
    combination 

つまり、選択リストからグループリストにペーストをコピーできます。これをしないと、MySQLはこれを暗黙的に行います(つまり、選択リストでmaxのような集約関数を使用していますが、group by節を忘れるか省略すると、agggregateにないすべてのものが取られます)あなたがそれを書いたかのようにグループ化を実行してください)。 group byが主に冗長であるかどうかはよく議論されますが、ロールアップ、キューブ、グループ化など、グループでできることが他にもあります。また、決定論的な関数でその列が使用されている場合、その列を決定性関数の結果にグループ化することなく、列をグループ化することもできます。そうすることへの任意のポイントは、別の時間のための議論がされているかどうか:)

+0

素晴らしい! DISTINCT関数の説明をありがとう。私はそれが単一の列ではなく行全体に適用されていることを認識しませんでした。 –

+0

「SELECTコース、COUNT(性別)COUNT(別の性別)FROM学生登録GROUP BYコース」の意味で、特定の列に明確に適用できるので混乱します。 )コースの生徒数を効果的にカウントしますが、性別を区別すると、コースが男女だけであるかどうかが効果的にわかります。この区別は列ごとで、行ごとに使用されますが、それは最初の列にのみ適用されました –

+0

グルーピングを働かせるための情報を追加 –

1

あなたはGROUP BY、およびdateフィールドに集計、このような何かを追加する必要があります

SELECT atable.phonenumber, MAX(btable.date) 
FROM btable 
LEFT JOIN atable ON btable.id = atable.id 
WHERE btable.country_id = 4 
GROUP BY atable.phonenumber 

これが最大値に戻りますが日付、帽子は最新の日付です...

関連する問題