2

UNIONを使用したSELECTでいくつかのフィールドが欠落している理由がわからないため、ますますイライラしています。これに関する優れたドキュメントを読み、最も一般的な例に従って、最初の SELECT と 2 番目の SELECT の間で異なる数の列を取得しないようにしました。

これは、2 つのステートメントの間に偶数の列に達する NULL 列を追加することで構成されます。

ここに私の場合:

$query = "(SELECT GC.GroupNO AS GroupNO,
    GC.Name AS Name,
    GC.Pax AS Pax,
    GC.Start AS Start,
    NULL AS custid,
    NULL AS firstname,
    NULL AS lastname,
    NULL AS arrivaldate,
    NULL AS hour,
    NULL AS pax,
    NULL AS cctype,
    NULL AS created,
    NULL AS sid,
    NULL AS ref_source,
    NULL AS numnights
  FROM LargeGroupHostels, GroupContacts AS GC
   WHERE LargeGroupHostels.HostelNumber = %d
   AND LargeGroupHostels.Status = %s
   AND LargeGroupHostels.GroupNO = GC.GroupNO";
   AND GC.Start < %s
   ORDER BY LastUpdated DESC LIMIT %d, %d
   )UNION(
    SELECT
    NULL AS GroupNO,
    NULL AS Name,
    NULL AS Pax,
    NULL AS Start,
    `custid`,
    `firstname`,
    `lastname`,
    `arrivaldate`,
    `hour`,
    `pax`,
    `cctype`,
    `created`,
    `sid`,
    `ref_source`,
    datediff(departdate, arrivaldate) AS numnights
    FROM customer_details
    WHERE hostelnumber = %d
    AND lastupdated = "" AND status != "CANX"
    AND booking_type IN ("HOSTEL", "HOSTELPACK")
    ORDER BY customer_details.arrivaldate, customer_details.created
    LIMIT %d, %d )
    ';

私が知っているいくつかの最適化といくつかの変更は別として、ここでの私の質問は次のとおりです。-列を取得しないのはなぜGC.Name,GC.Pax,GC.Startですか? GC.Name,GC.Pax,GC.Start2 つの SELECT を逆にすると、他の列だけを考慮して回避すると、まったく逆のことが起こります。

私はこの種のクエリについてあまり練習していません。これを処理するのは初めてです。私は何かが欠けていると確信していますが、何がわかりません

4

2 に答える 2

1

たとえばGC.name、でUNION しようとしていNameます。これらは、MySQL によって 2 つの別個の列として解釈されます。これは、意図をインテリジェントに推測する方法がないためです (おそらくその機能を持っているべきではありません)。次のように、現在エイリアスを持たない最初の SELECT ステートメントで列名にエイリアスを設定する必要があります。

SELECT GC.GroupNO AS GroupNO,
GC.Name AS Name,
GC.Pax AS Pax,
GC.Start AS Start,

それ以外の場合はすべて、エイリアスまたは生の列名が一致します。

また、これは何らかのJOINに適している可能性が高いという上記のコメントの1つにも同意します。

于 2016-02-12T16:52:54.767 に答える