2010-12-15 174 views
0

我在表格中有一個名爲student_id的列,我在該列中存儲與特定記錄關聯的學生ID,並使用|字符進行分隔。下面是該列中的數據的一對夫婦的樣本條目:MySQL:LIKE查詢幫助?

243|244|245 
245|1013|289|1012 
549|1097|1098|245|1099 

我需要編寫的SQL查詢將返回擁有的'245 student_id記錄。任何幫助將不勝感激。

回答

4

不要在student_id字段中存儲多個值,因爲每個行和列交叉點只有一個值是First Normal Form的要求。這是一件好事,原因很多,但很明顯的一點是,它決定必須處理諸如「1245」的student_id這樣的情況。

相反,最好有一個單獨的表來存儲與此表中記錄相關的學生ID。例如(你要正確的約束條件添加到該表定義爲好),

CREATE TABLE mytable_student_id (
    mytable_id INTEGER, 
    student_id INTEGER 
); 

然後你就可以查詢使用連接:

SELECT * FROM mytable JOIN mytable_student_id 
    ON (mytable.id=mytable_student_id.mytable_id) WHERE mytable_student_id.student_id = 245 

注意,因爲你沒有張貼除了它包含一個student_id字段以外,關於您的原始表的任何模式詳細信息,我將其稱爲mytable用於此示例(假設它具有名爲id的主鍵字段 - 具有主鍵是1NF的另一個要求)。

+0

我認爲應該是'WHERE mytable_student_id.student_id = 245' – LHMathies 2011-03-06 09:07:34

0

@Donut關於第一範式是完全正確的:如果你有一對多的關係,你應該使用一個單獨的表,其他解決方案會導致ad hoc和不可維護的代碼。

但如果你面對的是實際上存儲這樣的數據,這樣做的一個常用的方法是這樣的:

WHERE CONCAT('|',student_id,'|') LIKE '%|245|%'

0

同樣,我用甜甜圈同意,但這是正確的如果您現在無法對數據執行任何操作,請使用查詢。

WHERE student_id like '%|245|%' or student_id like '%|245' or student_id like '245|%' 

這照顧245位於字符串的開始,中間或結尾。但是,如果你沒有堅持這種設計,請按照甜甜圈的建議。