在我的数据库中,我有这些表
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
问题是上面的查询从表中获取所有数据,而不是仅在city是1的地方。
我究竟做错了什么 ?
您想在查询中以1说什么? id或字段号?
您没有告诉查询要加入products和products_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
您没有将产品加入城市,而是获得了所有产品和城市的匹配。
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
用这个:
SELECT
p.id,
p.title
FROM products p
INNER JOIN products_to_city ptc ON ptc.id = p.id
where ptc.id = 1
LEFT JOIN products_to_city ptc ON p.id = ptc.id
像其他答案一样错过了ptc.id = 1的地方
参见基本问题:左外联接vs左联接,(http://stackoverflow.com/questions/2809594/basic-question-left-outer-join-vs-left-join)
他们是一样的。
您想离开内部联接。
将LEFT JOIN替换为JOIN
这是因为LEFT JOIN甚至将没有对应键的行(在连接的左侧)也带到了右表中。
JOIN仅采用满足pk和fk匹配的"左"和"右"表中的列
所以这将是您的解决方案
SELECT
p.id,
p.title
FROM products p
JOIN products_to_city ptc ON ptc.id = 1
当你这样做
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"的列。
您正在执行外部联接,因此在没有匹配的情况下,无论如何您都会返回该行。考虑一个内部联接。