mmu*_*iff 121 mysql join where-clause
我有两张桌子想加入.
我想要类别表中的所有类别以及category_subscriptions表中用户订阅的所有类别.
基本上这是我目前的查询:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
Run Code Online (Sandbox Code Playgroud)
这工作正常,但我想在查询的末尾添加一个where子句,然后基本上使它成为内部/ equi连接.
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
WHERE user_category_subscriptions.user_id = 1
Run Code Online (Sandbox Code Playgroud)
如何仅使用一个查询获取特定用户订阅的所有类别以及所有类别?
category_id是类别表和user_category_subscriptions中的键.user_id驻留在user_category_subscriptions表中.
谢谢
Eri*_*ric 267
你需要把它放在join条款中,而不是where:
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions ON
user_category_subscriptions.category_id = categories.category_id
and user_category_subscriptions.user_id =1
Run Code Online (Sandbox Code Playgroud)
看一下inner join,把一个条款放在join或where等同于.但是,有了outer join它们,它们就大不相同了.
作为join条件,您指定要加入表的行集.这意味着,它计算user_id = 1第一,并采取子集user_category_subscriptions用user_id的1加入到所有的行categories.这将为您提供所有行categories,而只有categories此特定用户订阅的行将在user_category_subscriptions列中包含任何信息.当然,所有其他的categories将被填充null在user_category_subscriptions列.
相反,where子句执行连接,然后减少行集.因此,这会完成所有连接,然后消除所有user_id不相等的行1.你得到一个效率低下的方法inner join.
希望这有帮助!
小智 10
试试这个
SELECT *
FROM categories
LEFT JOIN user_category_subscriptions
ON user_category_subscriptions.category_id = categories.category_id
WHERE user_category_subscriptions.user_id = 1
or user_category_subscriptions.user_id is null
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
184644 次 |
| 最近记录: |