2012-05-30 49 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〜说什么在你的查询?该id或字段号码? –

回答

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 JOINJOIN

这是因为LEFT JOIN了连排(在的连接左)有没有corrisponing钥匙插入右表。

JOIN从 “左” 和 “右” 表tooks只有科拉姆满足PKFK比赛

因此,这将是您的解决方案

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

您没有告诉查询要加入的内容productsproducts_to_city。特别是对于LEFT JOIN,它将强制结果集包含products_to_city中每个记录的products中的每条记录。我想你想要这样的:

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喜欢在其他anwers –