sql 左连接有条件

sql left join with condition

我在 Android 中遇到 SQLite 问题:

items 我应该得到:

1) 标题字段包含字符串的所有项目。示例“%sho%”

2) 检查项目是否属于给定项目 (22)

project
┌───┬─────────┐
│ id│idProject│
├───┼─────────┤
│ 1 │      1  │
│ 2 │      22 │
└───┴─────────┘
items         projectitems
┌───┬──────┐  ┌───┬─────────┬─────────┐
│id │ title│  │ id│  idItem │idProject│
├───┼──────┤  ├───┼─────────┼─────────┤
│10 │ show1│  │ 1 │      10 │      22 │
│11 │ show2│  │ 2 │      11 │      22 │
│12 │ show3│  │ 3 │      12 │      22 │
│13 │ show4│  │ 4 │      10 │       1 │
│14 │ show5│  │ 5 │      11 │       1 │
│15 │ show6│  │ 6 │      12 │       1 │
└───┴──────┘  └───┴─────────┴─────────┘

我试过这个:

SELECT 
  e.id, e.title, l.idProject 
from 
  items as e 
LEFT JOIN projectitems as l
  on e.id = l.idItem
WHERE 
  e.title LIKE '%sho%' AND l.idProject = 22
ORDER BY 
  e.title ASC

我得到的结果是:

id  title   idProject
10  show1   22
11  show2   22
12  show3   22

我想要的结果:

id  title   idProject
10  show1   22
11  show2   22
12  show3   22
13  show4   (null)
14  show5   (null)
15  show6   (null)

此外,如果您知道实现此目的的不同方法,请告诉我。 谢谢。

sqlfiddle

只需将条件从 WHERE 子句移动到 ON:

SELECT 
  e.id, e.title, l.idProject 
from 
  items as e 
LEFT JOIN projectitems as l
  on e.id = l.idItem
  and l.idProject = 22
WHERE
   e.title LIKE '%sho%'
ORDER BY 
  e.title ASC

您必须将 l.idProject = 22 移动到 ON 子句:

SELECT 
  e.id, e.title, l.idProject 
from 
  items as e 
LEFT JOIN projectitems as l
  on e.id = l.idItem AND l.idProject = 22
WHERE 
  e.title LIKE '%sho%' 
ORDER BY 
  e.title ASC

将谓词放在 WHERE 子句中会将 LEFT JOIN 变成 INNER JOIN