2016-08-18 56 views
0

试图用我有限的SQL知识来解决这个问题,并且我被卡住了。 :)SQLite:如何在不返回重复行的情况下搜索多个列?

这是在SQLite 3Python 3

我已经'JOIN'ed 2表(名称数据)。

我想在用户提供的文本(不区分大小写)的结果中搜索2列。如果在任一列中找到匹配项,则返回该行。

我遇到的问题是,如果在名称列中找到文本,我会得到多行返回(我猜是因为有多行名称)。

所需要的数据是“名_ID

下面是一个样机的连接(有我在这里没有包括其他列):

------------------------------------------------------------------- 
    | name_id |  name  |  data_id  | data  | 
    ------------------------------------------------------------------- 
    | 100  | John Smith |  200  | grey hair | 
    | 100  | John Smith |  201  | hairy teeth | 
    | 101  | Jerry Jones |  202  | white teeth | 
    | 103  | Barry Johnson |  256  | brown hair | 
    ------------------------------------------------------------------- 

所以,如果我搜索“牙齿”,我得到:

| 100  | John Smith |  201  | hairy teeth | 
    | 101  | Jerry Jones |  202  | white teeth | 

,如果我搜索 “毛”,我得到:

| 100  | John Smith |  200  | grey hair | 
    | 100  | John Smith |  201  | hairy teeth | 
    | 103  | Barry Johnson |  256  | brown hair | 

,或者,如果我搜索“约翰”,我得到:

| 100  | John Smith |  200  | grey hair | 
    | 100  | John Smith |  201  | hairy teeth | 
    | 103  | Barry Johnson |  256  | brown hair | 

但我真正想要的是根据每个“名_ID”,因此只返回一行:

| 100  | John Smith |  200  | grey hair | 
    | 103  | Barry Johnson |  256  | brown hair | 

剩下的SQLite的命令如下:

WHERE data LIKE "%john%" OR name LIKE "%john%" COLLATE NOCASE 

我已经尝试使用'DISTINCT',但它似乎根据指定的列删除重复的行。这些缺少的行包含的数据不会被搜索。

谢谢。

+0

你在这种情况下会发生什么?当多行符合您的标准时,您的应用程序应该如何运作? – karlosss

+0

如果你只是想要每个'name_id'的第一行,你可以使用'GROUP BY name_id'但我相信返回结果的顺序是由'WHERE'子句的顺序决定的。 – Adam

回答

1

好吧,我假设你只是想要name_id列中每个唯一值的第一条记录。如果是这种情况,那么你的查询应该看起来像这样。

SELECT 
    * 
FROM 
    names n 
    JOIN data d ON d.name_id = n.name_id 
WHERE 
    LCASE(n.name) LIKE '%john%' // Force lower so only 1 WHERE statement 
GROUP BY 
    n.name_id 

GROUP BY应该“塌陷”所有你所选择的任何列数据。因此,假设您想要计算每个name_id的结果数量,您可以按如下方式更改SELECT声明。

SELECT 
    n.name_id, 
    COUNT(n.name_id) AS result_count 
FROM 
// Rest of query 

如果你没有使用像SUM, COUNT, etc聚合函数则直接丢弃所有,但第一个结果。

如果这不是你要找的LMK。希望有所帮助。

+0

你的第二个代码块似乎缺少查询的其余部分... –

+0

是的我知道我只是简单地说明'SELECT'部分应该是什么样子。为了清晰起见,更新了w/comment。 – Adam

+0

谢谢Adam。 “GROUP BY”是我在这里需要的魔术短语。我已经添加到我的查询,它现在正常工作。 :) – teracow

0

除了将以前的回答同样的假设(即你正在寻找的唯一名称的第一个记录),我建议如下:

select names.name_id 
      , <names_fields> 
      , group_concat(data,';') 
from  names 
      join (select name_id, data from data_table) 
      on names.name_id = data.name_id 
where  name_id 
group by <name_fields> 

更多关于GROUP_CONCAT here

相关问题