sql左边加入条件

时间:2016-02-14 21:57:19

标签: android sql sqlite cursor

我在Android中使用SQLite遇到了这个问题:

项目我应该得到:

1)标题字段包含字符串的所有项目。例子'%笑%'

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

2 个答案:

答案 0 :(得分:2)

只需将标准从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

答案 1 :(得分:2)

您必须将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