2014-01-29 54 views
1

我需要基于下面的表模式构造一个SQLite语句。 ParentEventInfoID映射到同一个表中的其他项目。带内部选择的SQLite

表名EventInfo: _id,名称,描述,ParentEventInfoID,SortId为查询需求的要求

部分执行的名称和说明一个where子句,我没有问题:

SELECT * FROM EventInfo 
    Where Name LIKE "%search text%" OR 
     Description LIKE "%search text%" 
ORDER BY SortId; 

我遇到麻烦的部分是我还需要包含条目的父项。下面是返回所有匹配的LIKE的一份声明中,但即使我知道我应该有更多的只有一个父项:

SELECT * FROM EventInfo 
    Where Name LIKE "%search text%" OR 
      Description LIKE "%search text%" OR 
      _id = (SELECT ParentEventInfoID FROM EventInfo 
        Where (Name LIKE "%search text%" OR 
          Description LIKE "%search text%") 
ORDER BY SortId 

我还没有在一段时间做一吨的SQL和我感觉非常生锈。任何帮助是极大的赞赏。谢谢!

+2

用'IN'代替_id后面的'=' – Miller

+0

@MillerKoijam这样做了!你认为这是建立这种最有效的方法吗? – KevinM

+1

应该有更好的查询。我认为我们可以避免内部查询中的类似子句,因为我们正在碰到同一张表 – Miller

回答

1

试试这个

SELECT * FROM EventInfo 
    Where Name LIKE "%search text%" OR 
      Description LIKE "%search text%" OR 
      _id IN (SELECT ParentEventInfoID FROM EventInfo 
        Where (Name LIKE "%search text%" OR 
          Description LIKE "%search text%") 
ORDER BY SortId 

但应该有更好的查询避免像在内部查询子句。

+0

完美。谢谢您的帮助。我想找到一个更有效率的说法,但这让我继续前进。再次感谢! – KevinM

0

用户可以自JOINS

SELECT E1.* FROM EventInfo E1 
LEFT JOIN EventInfo E2 
ON E1._id =E2.ParentEventInfoID 
Where Name LIKE "%search text%" OR 
     Description LIKE "%search text%" OR 
ORDER BY E1.SortId 
+0

感谢您的快速回复。我刚刚尝试过这一点,最终得到的结果与我的第一条语句相同,不包括内部选择。 – KevinM