sql和mysql一起,SQL连接和MySQL

这篇博客探讨了一个SQL查询的问题,其中试图从'products'表中选取属于特定城市的商品(city_id=1)。原始查询使用LEFT JOIN返回了所有数据,而作者期望只返回与city_id=1匹配的记录。解决方案是使用INNER JOIN或简单的JOIN,正确连接'products'和'products_to_city'表,并在WHERE子句中指定city_id条件。
摘要由CSDN通过智能技术生成

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

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"的列。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值