0

2つのテーブルの1つ、またはその両方にある可能性のある日付(データベースのINTEGER)に基づいて並べ替えるSQLクエリを作成しようとしています。

これに関するテーブルのフィールドは次のとおりです。

割り当て:-id-id_lead-date_assigned

リード:-id --date_added

テーブルには他のフィールドがありますが、これらはこの質問には適用されません。

ここで必要なのは、リードの割り当てがない場合、「date_sort」変数をリードのdate_added値にすることです。リードの割り当てがある場合は、それを割り当てのdate_assigned値にします。

私の問題は、クエリを使用しても、結果リストに割り当てがないリードが表示されないことです。

ここに私のクエリが取り組んでいます:

$pagi_sql = "select 
             l.id, l.id_infusionsoft, l.name_first, l.name_last, l.postcode, a.website as a_website, l.website as l_website, l.date_added,
             a.id_dealership, a.id_lead, a.id as id_assign, a.date_assigned,
             d.name as dealership,
             if(a.id = null, l.date_added, a.date_assigned) as date_sort
             from `leads` as l
             left join `assignments` as a on (a.id_lead = l.id)
             left join `dealerships` as d on (d.id = a.id_dealership)
             $where
             order by date_sort desc";

これが私の元のクエリです。これは機能しますが、希望どおりに並べ替えられていません。

$pagi_sql = "select 
             l.id, l.id_infusionsoft, l.name_first, l.name_last, l.postcode, a.website as a_website, l.website as l_website, l.date_added,
             a.id_dealership, a.id_lead, a.id as id_assign, a.date_assigned,
             d.name as dealership
             from `leads` as l
             left join `assignments` as a on (a.id_lead = l.id)
             left join `dealerships` as d on (d.id = a.id_dealership)
             $where
             order by l.date_added desc";

リードは複数の割り当てを持つことができます....これが問題だと思います...しかし、私はそれを私が望む方法でソートする方法を理解できません。

これらを変更して、代わりに割り当てテーブルから選択する必要がありますか?しかし、その後、問題が発生しました。同じテーブルに未割り当てのリードをdate_added / date_assignedで並べ替えて表示するにはどうすればよいですか?

どんな助けでも素晴らしいでしょう。

4

1 に答える 1

1

この行を変更します。

if(a.id = null, l.date_added, a.date_assigned) AS date_sort

これに:

if(a.id IS NULL, l.date_added, a.date_assigned) AS date_sort

最初の行が希望どおりに並べ替えられない理由は、が不明な値であり、それ自体でさえも何にも等しくIFないため、のfalse条件が常に実行されているためです。NULL

IS NULLの代わりに使用する必要があります= NULL

価値観についてのより深い洞察については、この質問に対する私の答えを読んでください。NULL


編集:もっと簡潔にしたい場合は、次のことができます。

COALESCE(a.date_assigned, l.date_added)

このCOALESCE()関数は最初の非NULL引数を返します。

の値を表示する必要がない場合は、次の句date_sortに直接入れることもできます。ORDER BY

ORDER BY COALESCE(a.date_assigned, l.date_added)
于 2012-07-17T18:56:39.047 に答える