0

在我的数据库中,我有这些表

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

ETC .....

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 的地方

我究竟做错了什么 ?

4

8 回答 8

3

您没有告诉查询要加入什么products以及products_to_city继续。特别是使用whichLEFT JOIN将强制结果集包含. 我想你想要这个:productsproducts_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
于 2012-05-30T14:32:03.723 回答
2

用这个:

SELECT
 p.id,
 p.title
 FROM products p
 INNER JOIN products_to_city ptc ON ptc.id = p.id
 where ptc.id = 1
于 2012-05-30T14:30:36.417 回答
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
于 2012-05-30T14:31:03.810 回答
0

您正在执行外部联接,因此在没有匹配的情况下,无论如何都会返回该行。考虑一个内部连接。

于 2012-05-30T14:29:59.060 回答
0

当你这样做时

LEFT JOIN products_to_city ptc 

您是在告诉 MySQL(实际上是所有 SQL dbms)返回产品中的所有行,即使它们与连接条件不匹配。

要仅返回与连接条件匹配的行,请使用

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

请注意,您需要使用正确的列名连接表。

我不确定你在那个“其他”子句中想要什么,因为你写的东西——pct.id = 1——通常是你可能在 WHERE 子句中表达的东西。问题是 products_to_city 表没有任何名为“id”的列。

于 2012-05-30T14:30:20.527 回答
0

替换LEFT JOINJOIN

那是因为LEFT JOIN甚至将没有对应键的行(在连接的左侧)放入右表中。

JOIN只取满足pkfk匹配的“左”和“右”表中的列

所以这将是你的解决方案

SELECT
p.id,
p.title
FROM products p
JOIN products_to_city ptc ON ptc.id = 1
于 2012-05-30T14:30:31.680 回答
0

请参阅基本问题:LEFT OUTER JOIN vs Left Join,(http://stackoverflow.com/questions/2809594/basic-question-left-outer-join-vs-left-join)它们是相同的。你想要左内连接。

于 2012-05-30T14:30:52.817 回答
0
LEFT JOIN products_to_city ptc ON p.id = ptc.id
于 2012-05-30T14:32:38.443 回答