0

次のコードがあります。

$referrers_query = 
select c.customers_id, c.customers_firstname, c.customers_lastname, 
c.customers_email_address, c.customers_telephone, a.entry_street_address, 
a.entry_city, a.entry_state, a.entry_country_id, n.countries_name, 
a.entry_zone_id, a.entry_postcode, r.referrer_customers_id, 
r.referrer_key, r.referrer_homepage, r.referrer_approved, 
r.referrer_banned, r.referrer_commission from  customers as c,  
address_book  as a, referrers  as r, countries as n  
where a.entry_country_id = n.countries_id and c.customers_id = r.referrer_customers_id 
and a.address_book_id = c.customers_default_address_id  order by c.customers_lastname;

WHERE私がやりたいのは、句結合を作成する代わりに、結合をネストしたいということです。

上記の 5 つのデータベース テーブルがあります。顧客、address_book、リファラー、国、ゾーン。

しかし、どこから始めればよいかわかりません。これに関する主な問題は、上記のステートメントを使用することです。選択からいくつかのレコードが失われるようです。これは、一部のレコードが「zone_id」= 0 を使用しているためです。これを修正するには、単に 0 の空のレコードを作成するだけでしたが、それ以外に、結合を使用してこれを修正できますか?

4

1 に答える 1

2

明示的な s で記述されたクエリJOIN:

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
    c.customers_email_address, c.customers_telephone, a.entry_street_address, 
    a.entry_city, a.entry_state, a.entry_country_id, n.countries_name, 
    a.entry_zone_id, a.entry_postcode, r.referrer_customers_id, 
    r.referrer_key, r.referrer_homepage, r.referrer_approved, 
    r.referrer_banned, r.referrer_commission
FROM customers AS c
    JOIN referrers AS r ON (c.customers_id = r.referrer_customers_id)
    JOIN address_book AS a ON (a.address_book_id = c.customers_default_address_id)
    JOIN countries AS n ON (a.entry_country_id = n.countries_id)
ORDER BY c.customers_lastname

一致が存在する場合にゾーン テーブルからも情報を取得する場合は、次のLEFT JOINように追加する必要があります。

SELECT c.customers_id, c.customers_firstname, c.customers_lastname, 
    c.customers_email_address, c.customers_telephone, a.entry_street_address, 
    a.entry_city, a.entry_state, a.entry_country_id, n.countries_name, 
    a.entry_zone_id, a.entry_postcode, r.referrer_customers_id, 
    r.referrer_key, r.referrer_homepage, r.referrer_approved, 
    r.referrer_banned, r.referrer_commission
FROM customers AS c
    JOIN referrers AS r ON (c.customers_id = r.referrer_customers_id)
    JOIN address_book AS a ON (a.address_book_id = c.customers_default_address_id)
    JOIN countries AS n ON (a.entry_country_id = n.countries_id)
    LEFT JOIN {zones table name} AS z ON (z.{zones id column name} = a.entry_zone_id)
ORDER BY c.customers_lastname

また、選択する列をクエリの先頭に追加します。aLEFT JOINは常に左側のテーブル (最初にリストされているテーブル) から結果を返し、右側のテーブルに一致するものがない場合はNULL、右側のテーブルの列に対して s を返します。

于 2012-10-24T18:36:17.840 に答える