2016-10-21 2 views
0

私は自分のIDを取得することができますので、すべての重複をお互いに返す私のクエリからすべての行をリストしようとしていますが、結果。どのように私は私のクエリでそれをやって行くことができます。mysqlは重複を返し、最低のIDを除外します

マイクエリ

SELECT 
    a.tail_number, 
    min(a.id), 
    b.aircraft_id 
from aircraft a 
left join jobs b on a.id = b.aircraft_id 
where 
    a.active = 1 and b.aircraft_id is null 
    group by a.tail_number having count(*) > 1 

は、現在の出力

tail_number min(a.id) aircraft_id tail_count 
125TH  4429  NULL  7 
362FX  4223  NULL  7 
439FL  4221  NULL  7 
453FX  4220  NULL  7 
455FX  4259  NULL  7 

tail_number min(a.id) aircraft_id tail_count 
125TH  4429  NULL  1 
125TH  4430  NULL  1 
125TH  4431  NULL  1 
125TH  4432  NULL  1 
362FX  4223  NULL  1 
362FX  4224  NULL  1 
362FX  4225  NULL  1 
362FX  4226  NULL  1 
+0

入力とは何ですか? – Strawberry

+0

どういう意味ですか? – Suzed

+0

http://meta.stackoverflow.com/questions/333952/why-should-i-provide-an-mcve-for-what-seems-to-me-to-be-a-very-simple-sql-クエリ – Strawberry

答えて

1

を達成しようとして出力イムは、各尾数の最安IDを取得し、サブクエリで参加しますON条件の結果から除外します。メインクエリ内の任意のグループ化はもはやありますので、

SELECT a.tail_number, a.id 
FROM aircraft AS a 
JOIN (SELECT tail_number, MIN(id) AS minid 
     FROM aircraft 
     WHERE active = 1 
     GROUP BY tail_number 
     HAVING COUNT(*) > 1) AS m ON a.tail_number = m.tail_number AND a.id != m.minid 
LEFT JOIN jobs AS j ON a.id = j.aircraft_id 
WHERE j.aircraft_id IS NULL 
ORDER BY a.tail_number, a.id 

私は、同様のサブクエリにactive = 1COUNT(*) > 1のためのチェックを移動しませんしました。

+0

これは素晴らしいです、ありがとうございます。私の唯一の質問は、それがSQLで定義されていない場合はどこからbを得るのですか? – Suzed

+0

申し訳ありません、それはタイプミスでした。それは 'm'でなければなりません。 – Barmar

+0

これはあなたが達成しようとしている出力と同じ結果を与えません。それはあなたの説明になります。だから、結果に 'id = 4429'がありません。なぜなら、それは最低のIDなので、それを除外したいと言ったからです。 – Barmar

関連する問題