2013-04-02 50 views
1

我有以下表SQLite的查詢功能對多行

--------------------------------------- 
id,  type,  keyword,  default 
--------------------------------------- 
1,  1,  mcdonalds,  1 
2  1,  food,   0 
3,  1,  drinks,   0 
4,  2,  vending machine, 1 
5,  2,  drinks,   0 
6,  3,  station,   1 
7,  3,  travel,   0 
8  3,  train,   0 

這背後的想法是,我想要一個檢索算法查詢returing關鍵字「獨特的」類型(默認行),所以當我搜索麥當勞,我得到第一排,但是當我搜索食物或飲料時,我也獲得了第一排。

我已經做了這個使用子選擇。

SELECT type, keyword FROM keywords WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%?%') AND `default`=1 
; 

這個工程就像一個魅力,然而現在我希望能夠給多個關鍵字,例如「飲料&食」我曾嘗試

SELECT type, keyword FROM keywords WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%?%' OR keyword like'%?%') AND `default`=1 
; 

但是當我搜索「食品&飲料「在這種情況下,我會同時獲得」自動售貨機「和」麥當勞「。然而,自動販賣機只有一個關鍵詞「飲料」(它不供應食物)所以我不希望那個在我的結果。

當我做'AND'而不是OR時,我根本沒有結果(因爲一行不能同時有兩個值)。

有沒有人對我如何解決這個問題有任何建議?

回答

1

使用兩個獨立的子查詢,然後用AND結合查找:

SELECT type, 
     keyword 
FROM keywords 
WHERE type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%drinks%') 
    AND type IN (SELECT DISTINCT type FROM keywords WHERE keyword like '%food%') 
    AND "default"=1 
+1

您的查詢也總是返回一條記錄,如果添加3個關鍵字AND AND IN(SELECT DISTINCT類型FROM關鍵字WHERE關鍵字,例如'%station%')'它不返回 – cetver

+1

如果有兩個關鍵字匹配的類型,它將返回兩條記錄。 –

+0

是的,這個工作挺有用,但不是我在找的東西,當我現在尋找像「e d」這樣的東西時,它會像所有東西一樣顯示,因爲類似的東西太貪婪。 – Matthijn

1
/* 
t = keywords 
*/ 

SELECT * 
FROM t 
WHERE type IN (
    SELECT type 
    FROM (
     SELECT COUNT(id) AS count_matches, 
      type 
     FROM t 
     WHERE keyword LIKE '%drinks%' 
     OR keyword LIKE '%food%' 
     GROUP BY type 
     ) 
     q 
    ORDER BY count_matches DESC 
    LIMIT 1 
    ) 
AND "default" = 1 
+1

這總是返回一個記錄,即使關鍵字匹配兩個或零類型。 –

+0

根據問題,需要返回默認關鍵字與最佳最大匹配 – cetver

+1

您的查詢確實返回一個類型與最匹配的,但這不是我如何解釋這個問題... –

0

好了,感謝你的幫助。它已經找到了! :)

SELECT type, keyword FROM keywords WHERE type IN 
(SELECT type FROM keywords WHERE (`keyword` LIKE '%drinks%' OR keyword like '%food%') AND `default`!= 1 GROUP BY type HAVING COUNT(id) >= 2) 
AND `default`=1 

該查詢可以動態構建,所以這樣做是使用COUNT。在子查詢中返回的計數行數必須至少與用戶輸入的關鍵字數量一樣多。

[B]編輯似乎並沒有工作,或和類似有時給出了一個較高的計數高於預期[/ B]