2012-05-30 2 views
0

В моей базе данных у меня есть эти таблицыSQL присоединиться и MySQL

products 
------------- 
id | title | 
------------- 
1 Cheese 
2 Milk 
3 Water 

и т.д .....

products_to_city 

    ----------------------- 
    city_id | product_id | 
    ----------------------- 
    1   1 
    1   2 
    2   3 
    3   1 
    3   1 

Я использую этот SQL запрос, чтобы получить результат

SELECT 
p.id, 
p.title 
FROM products p 
LEFT JOIN products_to_city ptc ON ptc.id = 1 

Проблема заключается в том, что указанный выше запрос извлекает все данные из таблицы, а не только в том месте, где находится город 1

Что я делаю неправильно?

+0

то, что вы хотите сказать, по 1 в запросе? идентификатор или номер поля? –

ответ

0

Вы выполняете внешнее соединение, поэтому, когда совпадение не производится, вы все равно возвращаете строку. Рассмотрим внутреннее соединение.

0

Когда вы сделаете это

LEFT JOIN products_to_city ptc 

вы рассказываете MySQL (весь СУБД SQL, на самом деле), чтобы вернуть все строки из продуктов, даже если они не соответствуют условию объединения.

Чтобы вернуть только те строки, которые соответствуют условию объединения, используйте

INNER JOIN products_to_city ptc ON ptc.product_id = p.id AND (something else) 

Обратите внимание, что вам нужно соединить таблицы, используя правильные имена столбцов.

Я не уверен, что вы хотите в этом предложении «что-то еще», потому что что-то вроде того, что вы написали --pct.id = 1, - это обычно то, что вы можете выразить в предложении WHERE. Проблема состоит в том, что таблица products_to_city не имеет столбца с именем «id».

0

Заменить LEFT JOIN с JOIN

Это потому, что LEFT JOIN взял даже строки (слева от объединения), у которых нет ключа corrisponing в таблице справа.

JOIN Наталья принимает только Колум от «левых» и таблиц «правильных», которая удовлетворяет рк и Ф.К. матч

Так что это будет ваше решение

SELECT 
p.id, 
p.title 
FROM products p 
JOIN products_to_city ptc ON ptc.id = 1 
2

использовать это:

SELECT 
p.id, 
p.title 
FROM products p 
INNER JOIN products_to_city ptc ON ptc.id = p.id 
where ptc.id = 1 
0

см. Основной вопрос: ВЛЕВО ВЗАИМОДЕЙСТВУЮЩИЙСЯ ИЛИ ЛЕВЫЙ ВХОД, (http: // stackoverflow.com/questions/2809594/basic-question-left-outer-join-vs-left-join) они одинаковы. вы хотите левое внутреннее соединение.

2

Вы не присоединяетесь к продукции в городе, вы получаете соответствие всем продуктам и городам.

SELECT 
p.id, 
p.title 
FROM products p 
LEFT JOIN products_to_city ptc ON ptc.product_id = p.id 
where ptc.city_id = 1 
3

Вы не сказали, что запрос присоединиться products и products_to_city на. Особенно с LEFT JOIN, который заставит результирующий набор включить каждую запись в products для каждой записи в products_to_city.Я думаю, что вы хотите:

SELECT p.id, p.title 
FROM products p 
INNER JOIN products_to_city ptc 
    ON p.id = ptc.product_id 
WHERE 
    ptc.city_id = 1 
0
LEFT JOIN products_to_city ptc ON p.id = ptc.id 
+0

пропустил, где ptc.id = 1, как в других анверах –

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