0

私は次のテーブルを持っています:

**products** which has these fields: id,product,price,added_date
**products_to_categories** which has these fields: id,product_id,category_id
**adverts_to_categories** -> id,advert_id,category_id
**adverts** which has these fields: id,advert_name,added_date,location

カテゴリ14に属し、ロンドンにある広告が所有するすべての製品を返すSQLを実行できません。したがって、4つのテーブルと2つの条件があります。カテゴリ14からのものであり、製品の所有者はロンドンからのものです。SQLを実行するために多くのバリアントを試しましたが、結果はどれも正しくありませんでした。結合を使用する必要があり、どの結合(左、右、完全)を使用する必要がありますか?正しいSQLはどのようになりますか?よろしくお願いします。退屈してすみません:)

これは私がこれまでに試したことです:

SELECT p.id, product, price, category_id, 
       p.added_date, adverts.location, adverts.id 
FROM products p, 
     products_to_categories ptc, 
     adverts, 
     adverts_to_categories ac 
WHERE ptc.category_id = "14" 
  AND ptc.product_id=p.id 
  AND ac.advert_id=adverts.id 
  AND adverts.location= "London"
4

2 に答える 2

1

かなり基本的なロジック

Select * from Products P
INNER JOIN Products_To_Categories PTC ON P.ID = PTC.Product_ID
INNER JOIN Adverts_to_Categories ATC ON ATC.Category_Id = PTC.Category_ID
INNER JOIN Adverts AD on AD.ID = ATC.Advert_ID
WHERE PTC.Category_ID = 14 and AD.Location = 'LONDON' 

他のテーブルに存在しないテーブルからのレコードが必要な場合は、LEFT または Right 結合のみが必要です。
したがって、たとえば、カテゴリのないものも記録する場合でも、すべての製品が必要な場合は、内部の代わりに LEFT Join を使用します。

于 2012-06-05T21:56:27.973 に答える
1

次のステートメントは、ID が 14 のカテゴリ内の製品テーブルのすべての列と、ロンドンにあるすべての広告を返す必要があります。

select p.* from products p
inner join products_to_categories pc on p.id = pc.product_id
inner join adverts_to_categories ac on pc.category_id = ac.category_id
inner join adverts a on a.id = ac.advert_id
where pc.category_id = 14
and ac.location = 'London';

これらの文字列ベースのクエリを頻繁に実行する場合は、列の場所にインデックスを追加することを忘れないでください。

于 2012-06-05T22:00:22.620 に答える