2012-06-05 4 views
0

У меня есть следующие таблицы:получить правильный результат с помощью MySQL Query

**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 и которые принадлежат объявлениям, расположенным в Лондоне. Итак, у меня есть 4 таблицы и 2 условия - от 14-й категории, а владелец продукта - от Лондона. Я пробовал много вариантов для выполнения sql, но ни один из результатов не был прав. Нужно ли использовать Join, а какие Join - left, right, full? Как будет выглядеть правильный 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" 
+2

Что вы пытались и как были неверны результаты? –

+0

ВЫБОР p.id, продукт, цена, category_id, p.added_date, adverts.location, adverts.id из продуктов р, products_to_categories, объявления термисторов, adverts_to_categories переменного тока ГДЕ ptc.category_id = "14" И ptc.product_id = p.id И ac.advert_id = adverts.id И adverts.location = "Лондон", но это возвращает неверные результаты. – Europeuser

+1

Первый statrt, никогда не используя неявный синтаксис снова. Это aspil antipattern и очень плохой метод программирования. – HLGEM

ответ

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 Join вместо внутреннего.

+0

Благодарю вас, ребята, xQbert ваши работы sql! Спасибо за вашу помощь ! – Europeuser

+0

Вы можете обратиться по этой ссылке http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html. Это один из моих любимых сайтов, объясняющий разные типы объединений. – xQbert

1

следующее утверждение должно возвращать все столбцы из таблицы продуктов в категории с идентификатором 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'; 

Вы должны помнить, чтобы добавить индекс к местоположению столбца, если вы делаете это строковые запросы очень часто.

+0

спасибо egore911 !, проблема решена :) – Europeuser

Смежные вопросы