2017-11-25 45 views
-2

我有一個歌曲的數據庫和他們的詞與列:
序列,名稱,單詞。如何從sql數據庫查詢具有所有指定單詞的歌曲?

主鍵是串行的。
Word列只包含一個單詞。

我想用他們的話來查詢包含所有單詞「我愛你」的歌曲。
我怎樣才能做到這一點在SQL?

順便說一句,我用java來執行語句,所以如果這有助於任何內置查詢,它也可以是好的。

數據庫行的〔實施例:
1 name1 love
1 name1 you
1 name1 why
1 name1 I
2 name2 love
2 name2 what
2 name2 we

+2

這不可能是真的*「主鍵是串行的」 *,因爲「串行」具有跨多個行具有相同值,任何主鍵值只能出現在一行。 –

回答

2

通過這種結構,你將不得不反覆生成一個查詢與多個子查詢,一個用於每個字。假設「串行」是一首標識符:

SELECT t1.serial, t1.name 
    FROM table1 t1 
WHERE t1.word = 'I' 
    AND EXISTS(SELECT * FROM table1 t2 WHERE t2.serial = t1.serial AND t2.word = 'love') 
    AND EXISTS(SELECT * FROM table1 t2 WHERE t2.serial = t1.serial AND t2.word = 'you'); 

你會繼續增加AND EXISTS...每個字。理想情況下,您會首先查詢最不常見的單詞,以儘早消除不匹配的歌曲。

關於(單詞)的索引將很有價值。關於(連續,單詞)的索引也可能是有價值的。

查詢優化器應該使用類似上面的查詢來查找所有帶有單詞'I'的歌曲,然後爲每個歌曲確定該歌曲是否也有'love'(否則它被排除)然後確定該歌曲是否也有「你」(否則它被排除)。

請注意,您的表格不是第三範式,因爲唯一的候選關鍵字是(串行,單詞),名稱在功能上並不依賴於此,所以您的表格結構有改進的空間。

-1
SELECT * from [tablename] 
WHERE word LIKE '%I love you%'; 

這個查詢將得到字段「我愛你」的字符串在words字段中的所有元組。

對於其他Java具體的東西,我建議你看看準備的語句(幫助防止SQL注入)

https://www.javatpoint.com/PreparedStatement-interface

+2

抱歉不起作用。字欄只包含1個字 – Davis8988

0

你可以嘗試使用WHERE EXISTS三次爲單詞我,愛,和你。如果單詞重複多次,則可能需要DISTINCT。

SELECT DISTINCT Serial, Name 
    FROM WordsTable WT1 
WHERE EXISTS (SELECT * FROM WordsTable WT2 WHERE WT1.Serial = WT2.Serial 
               AND WT1.Name = WT2.Name 
               AND WT2.Word = 'I') 
    AND EXISTS (SELECT * FROM WordsTable WT2 WHERE WT1.Serial = WT2.Serial 
               AND WT1.Name = WT2.Name 
               AND WT2.Word = 'love') 
    AND EXISTS (SELECT * FROM WordsTable WT2 WHERE WT1.Serial = WT2.Serial 
               AND WT1.Name = WT2.Name 
               AND WT2.Word = 'you'); 
0
Select name 
    from my_table 
where word in ('i','love','you') 
group 
    by name 
having count(distinct word) = 3; 
相關問題