2016-06-21 4 views
1

長時間リスナー、初回呼び出し元。Group Byを使用せずにMySQLの多対多クエリーから重複を削除するにはどうすればよいですか?

私はすべての運河を英国の地域に関連付けることができるインターフェイスを作成しています。私はすべての運河のリストを返すためにデータベースが必要です。このリスティングには、運河が編集中の地域にある場合は、運河IDとブリッジテーブルIDも含まれていなければなりません。

(私はそれがどのように見えるかをお見せしたいが、どうやら私は初心者のように二つの画像に限定されたんだ)

関連するテーブルは以下のとおりです。

運河テーブル:ID、名前、説明など 領域テーブル: regions_canalsテーブル同上:ID、left_id(領域)、right_id(運河)

この例では、Iは、ウェスト・ミッドランズ(領域6)に運河を編集しています。私は、運河がすでにWest Midlandsにあると指定されているかどうかを示すメッセージを表示して、MySQLにすべての運河のリストを返すようにします。

私はこのような結果たいと思います:

The ideal result

を(そして、はい、私はオックスフォードはウェスト・ミッドランズではありません知っている)しかし、私は実際に取得することはこれです:

Notice duplicate rows

この例では、スランゴスレン、オックスフォード、シュロップシャー連合運河を二重に取得しています。私は、余分な運河を取り除くために必要ではなく、領域に対応するもの(left_id)6.

これは動作するはずですが示唆されています:

SELECT regions_canals.id AS bridge_id, regions.id AS left_id, regions.name AS region_name, canals.id AS right_id, canals.name AS canal_name 
FROM canals 
LEFT JOIN regions_canals ON regions_canals.right_id = canals.id 
LEFT JOIN regions ON regions_canals.left_id = regions.id 
GROUP BY canals.id 
ORDER BY canal_name; 

しかし、これは、次のMySQLのエラーメッセージになり:

#1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'nbb.regions_canals.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

これはほとんど動作します:

SELECT canals.id, canals.name, IF(
canals.id IN 
    (SELECT canals.id 
     FROM canals 
     JOIN regions_canals ON regions_canals.right_id = canals.id 
     JOIN regions ON regions_canals.left_id = regions.id 
     WHERE regions.id = 6), true, false) 
AS region from canals 
ORDER BY canals.name; 

私が言うことができた運河West Midlandsにありますが、bridge_idは含まれていません。West Midlandsのような地域(オックスフォードのよ​​うな)から運河を取り除きたい場合は、私が必要です。

+0

んが、画像のおかげで。ちょうどよく書式設定されたテキスト。長い時間聞き手として、それを行う方法はかなり明らかにする必要があります – Strawberry

+0

私はこの中でエイリアスとして使用された左と右を見たことがない。それはあなたのアイデアですか?それは非常に混乱しています! – Strawberry

答えて

0

例の同様のタイプして、以下のリンクを参照してくださいません - http://www.databasejournal.com/features/mysql/article.php/3911786/Eliminating-Duplicate-Rows-from-MySQL-Result-Sets.htm

+0

ありがとう、エリザベス。私は十分なコーヒーを持ってから見ていきます。私は就寝前に質問を投稿しました。 –

+0

もう一度感謝します、エリザベス。私は他の似たようなチュートリアルを読んでいましたが、これは特にエラーメッセージに照らしてもっと意味がありました。私はまだ私のニーズにそれを適応させる方法がわかりませんが、私はそれを使って遊びます。重複を特定すると、編集中の地域に対応する地域IDを持たないものを取り除くことができます。 –

+0

次のクエリを試しましたが、エラーは発生しませんが、すべてにname_countも1を割り当てます。だから私は努力し続けます。 'bridge_id AS \t regions_canals.id、left_id AS \t regions.id、REGION_NAME AS \t regions.name、AS right_id \t canals.id、canal_name AS \t canals.name、 \t COUNT(運河を選択します。運河 \t \t左からname_count \t \t AS名)regions_canals.right_id = canals.id \t \t左側にregions_canalsがregions_canals.left_id = regions.id 0123上の領域をJOIN JOIN canals.id BY\t \t GROUPは、bridge_id \t \t HAVING name_count> 1; '' –

関連する問題