我在表格中有一個名爲student_id
的列,我在該列中存儲與特定記錄關聯的學生ID,並使用|
字符進行分隔。下面是該列中的數據的一對夫婦的樣本條目:MySQL:LIKE查詢幫助?
243|244|245
245|1013|289|1012
549|1097|1098|245|1099
我需要編寫的SQL查詢將返回擁有的'245 student_id
記錄。任何幫助將不勝感激。
我在表格中有一個名爲student_id
的列,我在該列中存儲與特定記錄關聯的學生ID,並使用|
字符進行分隔。下面是該列中的數據的一對夫婦的樣本條目:MySQL:LIKE查詢幫助?
243|244|245
245|1013|289|1012
549|1097|1098|245|1099
我需要編寫的SQL查詢將返回擁有的'245 student_id
記錄。任何幫助將不勝感激。
不要在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的另一個要求)。
@Donut關於第一範式是完全正確的:如果你有一對多的關係,你應該使用一個單獨的表,其他解決方案會導致ad hoc和不可維護的代碼。
但如果你面對的是實際上存儲這樣的數據,這樣做的一個常用的方法是這樣的:
WHERE CONCAT('|',student_id,'|') LIKE '%|245|%'
同樣,我用甜甜圈同意,但這是正確的如果您現在無法對數據執行任何操作,請使用查詢。
WHERE student_id like '%|245|%' or student_id like '%|245' or student_id like '245|%'
這照顧245位於字符串的開始,中間或結尾。但是,如果你沒有堅持這種設計,請按照甜甜圈的建議。
我認爲應該是'WHERE mytable_student_id.student_id = 245' – LHMathies 2011-03-06 09:07:34