2016-08-18 25 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

相關問題