Mysql: การนับจำนวนค่าที่คั่นด้วยเครื่องหมายจุลภาคด้วย Like

ฉันตัดสินใจใช้ favs (รหัสของผู้ใช้ที่ทำเครื่องหมายโพสต์นั้นเป็นรายการโปรด) เป็นรายการที่คั่นด้วยเครื่องหมายจุลภาคในคอลัมน์ favs ซึ่งอยู่ในตารางข้อความที่มีผู้ส่ง, url, เนื้อหา ฯลฯ

แต่เมื่อฉันพยายามนับแถวเหล่านั้นด้วยแบบสอบถามเช่น:

select count(id) 
from messages 
where favs like '%userid%' 

แน่นอนว่ามันส่งคืนผลลัพธ์ที่ผิดเพราะ id ทั้งหมดอาจเป็นส่วนหนึ่งของรหัสอื่น

ตัวอย่างเช่น ขณะสืบค้น id=1 จะเป็นการเพิ่มตัวนับสำหรับเนื้อหาอื่น ๆ ที่ผู้ใช้ id 11 ชื่นชอบ...

คุณช่วยบอกความคิดของคุณหรือวิธีแก้ปัญหาใด ๆ เพื่อทำให้ระบบนี้ใช้งานได้ได้ไหม?


person jnbn    schedule 30.04.2009    source แหล่งที่มา


คำตอบ (4)


ด้วยเพียงไม่กี่อย่าง คุณก็สามารถมีวิธีแก้ปัญหาที่น่าเกลียดได้:

select count(id) from messages where favs like 'userid,%' or favs like '%,userid,%' or favs like '%,userid'

มีแนวโน้มว่าจะมีวิธีแก้ปัญหาที่หรูหรากว่า แต่อย่างน้อยนั่นก็จะให้ผลลัพธ์ที่คุณต้องการกลับมาอย่างน้อยที่สุด

person Warren Krewenki    schedule 30.04.2009

เป็นไปได้หรือไม่ที่จะเปลี่ยนโมเดลข้อมูลของคุณโดยให้การเชื่อมโยงระหว่างผู้ใช้และข้อความโปรดของพวกเขาถูกเก็บไว้ในตารางอื่นแทน

การจัดเก็บการเชื่อมโยงในคอลัมน์เดียวจะลบล้างข้อดีของฐานข้อมูลเชิงสัมพันธ์ คุณจ่ายต้นทุนประสิทธิภาพโดยใช้ฟังก์ชัน like คุณจะไม่สามารถเก็บข้อมูลเพิ่มเติมเกี่ยวกับความสัมพันธ์ได้อีกต่อไป และข้อมูลจะยากต่อการสืบค้น

โมเดลทางเลือกอาจมีลักษณะเช่นนี้ (ไม่สามารถใส่รูปภาพได้เนื่องจากฉันเป็นผู้ใช้ใหม่ แต่ฉันได้สร้าง ที่นี่):

users
 - id

messages
 - id

favorite_messages
 - user_id (foreign key to users.id)
 - message_id (foreign key to messages.id)

เมื่อเป็นเช่นนั้น คำถามเดิมของคุณก็จะง่ายขึ้นเป็นดังนี้:

select count(1) from favorite_messages where user_id = userid

นอกจากนี้ คุณยังสามารถทำสิ่งต่างๆ เช่น รับรายการข้อความโปรดของผู้ใช้:

select 
    * 
from 
    messages 
    inner join favorite_messages 
        on messages.id = favorite_messages.message_id
where
    user_id = userid
person Jason Jones    schedule 30.04.2009

ควรใช้สิ่งนี้:

SELECT count(id) FROM messages WHERE FIND_IN_SET('userid',favs) > 0
person Community    schedule 02.06.2009

คุณอาจต้องรับค่า ระเบิดด้วย PHP แล้วนับอาร์เรย์

มีวิธีทำได้หลายวิธีใน MySQL แต่จากสิ่งที่ฉันเห็นมา วิธีเหล่านี้ยุ่งยากมาก

person alex    schedule 30.04.2009