2015-09-03 30 views
0

在表class_group中,list_students_id列包含文本,其中包含逗號分隔的用戶在當前組組中的用戶ID。 例如:組ID:1 - 組名稱:組1 - list_students_id:2,43,45,50 ... 我知道這不是最佳的,但我無法更改數據庫結構。 我要查詢的組名,如果學生是該組中和我寫了下面的代碼,我覺得這是不是最佳的如何以另一種方式編寫此查詢

SELECT user.firstname,user.lastname,user.username,user.alt_id,user.email,class_group.group_name 
FROM user LEFT JOIN class_group 
ON (class_group.list_students_id LIKE CONCAT(user.id,',%') OR class_group.list_students_id LIKE CONCAT('%,',user.id,',%')) 

任何其他方式做到這一點?

回答

0

有時候我們會被其他人對數據庫設計的真正糟糕的決定所困擾。你應該知道實現這種結構的正確方法。 SQL具有很好的列表數據結構。它被稱爲不是字符串

在任何情況下,我想你想:

SELECT u.firstname, u.lastname, u.username, u.alt_id, u.email, cg.group_name 
FROM user u LEFT JOIN 
    class_group cg 
    ON find_in_set(u.id, list_students_id) > 0; 

注意這個查詢無法使用索引的,所以性能一般會比使用合適的數據結構惡化。

+0

感謝的人使用,這爲我節省了大約60毫秒。是的,我同意我在這家公司堅持使用這個數據庫模式,因爲他們說它是針對特定功能進行了優化的,他們不知道我們會在別處使用它,現在更改數據庫將需要重構很多代碼,所以它有點傷心。 –

0

的一種方法是使INSTR()功能

SELECT user.firstname,user.lastname,user.username,user.alt_id,user.email, 
class_group.group_name 
FROM user LEFT JOIN class_group 
ON INSTR(class_group.list_students_id, user.id) > 0; 
+0

如果列表中包含用戶標識(例如:user.id = 71 - 元素:571或271 ....),但無論如何感謝您的幫助 –

+1

是的,你是對的 –